配置文件对象 + 视图模型 + 更新用户配置文件 MVC C#
Posted
技术标签:
【中文标题】配置文件对象 + 视图模型 + 更新用户配置文件 MVC C#【英文标题】:Profile Object + View Model + Updating User Profile MVC C# 【发布时间】:2011-02-26 22:24:37 【问题描述】:问题: 我创建了一个自定义配置文件对象,如 Joel here 所述。然后我使用 Jeremy 的方法 (here) 来扩展自定义配置文件以允许我使用生成用户并设置这些值。然后我创建了一个 ViewModel 来显示会员信息和个人资料信息,以便用户可以更新他们的会员信息(电子邮件)和个人资料信息。 **视图显示了我在视图中更新信息中输入的所有字段,然后点击保存,出现如下错误
System.Configuration.SettingsPropertyNotFoundException:找不到设置属性“FirstName”。 **
这是我的自定义配置文件对象(模型):
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;
这里是 UserProfile 获取方法:
[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);
如您所见,我正在使用视图模型来显示视图。 视图模型是这样的:
public class UserViewModel
public UserInformation UserInf get; set;
public ProfileInformation Profile get; set;
最后更新 UserProfile 的 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");
问题是我无法弄清楚错误来自哪里。表单呈现我输入有效信息,然后我被告知“未找到设置属性 'FirstName'。”就像 UserViewModel 正在尝试更新 ProfileInformation.cs (自定义配置文件对象),但它说它找不到对象......我想这是因为它没有要更新的配置文件......但我在发布之前无法解决错误……太令人沮丧了!任何帮助将不胜感激!!!感谢您抽出宝贵时间查看此内容。
我还将向您介绍我的 Register 方法,该方法成功地使用了自定义 Profile 对象,甚至将 name 属性更新为“ScoobyDoo”以进行测试:)
[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 文章 here、here 和 here。
我希望这些能帮助您顺利上路!
【讨论】:
以上是关于配置文件对象 + 视图模型 + 更新用户配置文件 MVC C#的主要内容,如果未能解决你的问题,请参考以下文章
使用 URLSession 和 ViewModel 检索数据
csharp 使用SharePoint客户端对象模型从SharePoint用户配置文件服务获取信息。这使用了对Profile DB的查询