如何创建用于编辑用户自定义信息的操作和视图?
授权基于VS与MVC 4项目创建的成员资格。
我已经添加了其他列,例如FirstName等。我需要并且注册正常,但我不知道如何让这些属性显示在@Html.EditorFor
视图中并保存数据库中的更改(表UserProfile)。
非常感谢每一个提示。
为版本创建模型:
public class UserProfileEdit
{
[Required]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last name")]
public string LastName { get; set; }
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
答案 0 :(得分:7)
所以你想要一个编辑页面来编辑用户的个人信息。其他列已添加到UserProfile表中。
首先,您需要一个用于编辑视图的动作方法。从数据库中获取用户并构建UserProfileEdit模型。
public ActionResult Edit()
{
string username = User.Identity.Name;
// Fetch the userprofile
UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.Equals(username));
// Construct the viewmodel
UserProfileEdit model = new UserProfileEdit();
model.FirstName = user.FirstName;
model.LastName = user.LastName;
model.Email = user.Email;
return View(model);
}
当我们发布editform时,我们发布了UserProfileEdit模型。我们再次从数据库中获取UserProfile并更改已发布的字段。
[HttpPost]
public ActionResult Edit(UserProfileEdit userprofile)
{
if (ModelState.IsValid)
{
string username = User.Identity.Name;
// Get the userprofile
UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.Equals(username));
// Update fields
user.FirstName = userprofile.FirstName;
user.LastName = userprofile.LastName;
user.Email = userprofile.Email;
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index", "Home"); // or whatever
}
return View(userprofile);
}
现在它只是在您的视图中进行编码。我看起来像这样:
@model UserProfileEdit
@using (Html.BeginForm("Edit", "Account"))
{
@Html.EditorFor(model => model.FirstName)
@Html.EditorFor(model => model.LastName)
@Html.EditorFor(model => model.Email)
<input type="submit" value="Save" />
}
如果您的编辑模型有大量字段,Automapper可能会有所帮助。此解决方案编辑当前登录的用户,但添加用户名作为操作参数则相当简单。
答案 1 :(得分:0)
要向UserProfile表添加其他属性,您需要更改
中的一系列更改在这个示例中,我添加了一个名为&#34; MobileNumber &#34;的新字段,已将其声明为类型字符串。
[Table("UserProfiles")]
public class UserProfiles
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set;}
public string Email { get; set;}
public string FirstName { get; set; }
public string LastName { get; set; }
public string MobileNumber { get; set; }
}
在模型中添加新属性。在这个我们想要在用户注册时需要额外字段的示例中,我们需要更新RegisterModel
类。如果需要,添加验证。
public class RegisterModel
{
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[StringLength(11, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 11)]
[Display(Name = "Mobile No.")]
public string MobileNumber { get; set; }
}
更新模型后,您应该可以在视图中使用@Html.TextBoxFor(m => m.MobileNumber)
,这会将MobileNumber
字段绑定到您的&#39; MobileNumber&#39;在您的模型中声明的属性。
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.LabelFor(m = m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.LabelFor(m => m.MobileNumber)
@Html.TextBoxFor(m => m.MobileNumber)
<input type="submit" value="Register">
}
最后一步,在这里您只需要阅读发布到模型的值并将其传递到存储库以进行保存。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.Email, model.Password,
new
{
FirstName = model.FirstName,
LastName = model.LastName,
MobileNumber = model.MobileNumber
});
WebSecurity.Login(model.Email, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
现在,由于您的RegisterModel已经具有此属性,因此您的UserProfile类也是如此,在您的视图上使用RegisterModel类,您应该能够访问新添加的属性。
从这里采取:How to add additional fields when using Membership in ASP.NET MVC 4