2011-02-26 15 views
6

问题: 我已经创建如由Joel here描述的定制配置文件对象。然后,我使用Jeremy的方法(here)扩展自定义配置文件,以允许我使用生成用户并设置这些值。然后,我创建了一个ViewModel来显示Memeberhip信息和配置文件信息,以便用户可以更新他们的会员信息(电子邮件)和配置文件信息。 **视图显示所有我在查看更新后的信息输入,并点击保存等领域,在那里我碰到下面的错误资料对象+视图模型+更新用户配置文件MVC C#

System.Configuration.SettingsPropertyNotFoundException的:设置属性“姓”没有被发现。 **

这里是我的自定义配置文件对象(模型):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Profile; 
using System.Web.Security; 


namespace NDAC.Models 
{ 
    public class ProfileInformation : ProfileBase 
    { 
     static public ProfileInformation CurrentUser 
     { 
      get 
      { 
       if (Membership.GetUser() != null) 
       { 
        return (ProfileInformation)(ProfileBase.Create(Membership.GetUser().UserName)); 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 

     public virtual string FirstName { 
      get 
      { 

       return ((string)(base["FirstName"])); 
      } 
      set 
      { 
       base["FirstName"] = value; Save(); 
      } 
     } 
     public virtual string LastName { 
      get 
      { 
       return ((string)(base["LastName"])); 
      } 
      set 
      { 
       base["LastName"] = value; Save(); 
      } 
     } 
     public string Street 
     { 
      get 
      { 
       return ((string)(base["Street"])); 
      } 
      set 
      { 
       base["Street"] = value; Save(); 
      } 
     } 
     public string Street2 
     { 
      get 
      { 
       return ((string)(base["Street2"])); 
      } 
      set 
      { 
       base["Street2"] = value; Save(); 
      } 
     } 
     public string City 
     { 
      get 
      { 
       return ((string)(base["City"])); 
      } 
      set 
      { 
       base["City"] = value; Save(); 
      } 
     } 
     public string State 
     { 
      get 
      { 
       return ((string)(base["State"])); 
      } 
      set 
      { 
       base["State"] = value; Save(); 
      } 
     } 
     public string ZipCode 
     { 
      get 
      { 
       return ((string)(base["ZipCode"])); 
      } 
      set 
      { 
       base["ZipCode"] = value; Save(); 
      } 
     } 
     public string PhoneNumber 
     { 
      get 
      { 
       return ((string)(base["PhoneNumber"])); 
      } 
      set 
      { 
       base["PhoneNumber"] = value; Save(); 
      } 
     } 
     public string SemesterID 
     { 
      get 
      { 
       return ((string)(base["SemesterID"])); 
      } 
      set 
      { 
       base["SemesterID"] = value; Save(); 
      } 
     } 

     static public ProfileInformation GetProfile(string username) 
     { 
      return Create(username) as ProfileInformation; 
     } 

     internal static ProfileInformation NewUser 
     { 
      get { return System.Web.HttpContext.Current.Profile as ProfileInformation; } 
     } 

    } 
} 

下面是用户配置获取方法:

[Authorize] 
     public ActionResult UserProfile() 
     { 
      string id = User.Identity.Name.ToString(); 
      MembershipUser user = Membership.GetUser(id); 

      var model = new UserViewModel(); 

      UserInformation userInf = new UserInformation(); 
      userInf.Username = user.UserName; 
      userInf.Email = user.Email; 

      ProfileInformation currentProfile = ProfileInformation.GetProfile(user.UserName); 

      model.Profile = currentProfile; 
      model.UserInf = userInf;  

      return View(model); 

     } 

正如你可以看到我使用一个View Model来显示视图。 视图模型是这样的:

public class UserViewModel 
    { 

     public UserInformation UserInf{ get; set; } 
     public ProfileInformation Profile { get; set; } 


    } 

最后的更新用户配置的HttpPost方法是:

[Authorize] 
     [HttpPost] 
     public ActionResult UserProfile(UserViewModel model) 
     { 
      ProfileInformation currentProfile = ProfileInformation.GetProfile(User.Identity.Name.ToString()); 

      ProfileInformation.CurrentUser.FirstName = model.Profile.FirstName; 
      currentProfile.LastName = model.Profile.LastName; 
      currentProfile.Street = model.Profile.Street; 
      currentProfile.Street2 = model.Profile.Street2; 
      currentProfile.City = model.Profile.City; 
      currentProfile.State= model.Profile.State; 
      currentProfile.ZipCode = model.Profile.ZipCode; 
      currentProfile.PhoneNumber = model.Profile.PhoneNumber; 
      currentProfile.Save(); 

      MembershipUser user = Membership.GetUser(User.Identity.Name.ToString()); 
      user.Email = model.UserInf.Email; 
      Membership.UpdateUser(user); 


      TempData["SuccessMessage"] = "Your Profile information has been saved"; 
      ViewBag.Title = "My Profile"; 
      return RedirectToAction("ProfileUpdated"); 
     } 

问题是我无法揣摩出错误是来自。表单呈现我输入有效的信息,然后我被告知“设置属性'名字'找不到。”这就像UserViewModel试图更新ProfileInformation.cs(自定义配置文件对象),但它说它找不到对象...我想这是因为它没有配置文件来更新...但我在发布之前无法获得错误...非常令人沮丧!任何帮助将不胜感激!!!感谢您花时间检查了这一点。

我也会离开你成功地使用自定义配置文件对象,甚至我的注册方法更新名称属性为“史酷比”用于测试目的:)

[HttpPost] 
     public ActionResult Register(RegisterModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       // Attempt to register the user 
       MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email, model.SecretQuestion, model.SecretAnswer); 

       if (createStatus == MembershipCreateStatus.Success) 
       { 

        FormsService.SignIn(model.UserName, false /* createPersistentCookie */); 
        Roles.AddUserToRole(model.UserName, "Student"); 
        ProfileInformation.NewUser.Initialize(model.UserName, true); 
        ProfileInformation.NewUser.Save(); 

        string currentSemesterID = CurrentSemester; 
        ProfileInformation profile = ProfileInformation.GetProfile(model.UserName); 
        profile.SemesterID = currentSemesterID; 
        profile.FirstName = "ScoobyDoo"; 

        return RedirectToAction("Index", "Home"); 
       } 
       else 
       { 
        ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus)); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
      return View(model); 
     } 

回答

1

您可能需要提供您的自己的配置文件实施...如果你已经这样做了,你有没有添加自定义提供程序类型到你的“web.config”?

例子:

<profile defaultProvider="TableProfileProvider" enabled="true" inherits="YourNamespace.YourClass, YourNamespace"> 

大MSDN文章hereherehere

我希望这些能让你顺其自然!