问题与编辑使用自定义模式
问题描述:
我有这个数据模型:问题与编辑使用自定义模式
public class User
{
public long UserID { get; set; }
[Required(ErrorMessage = "User name is required.")]
[MaxLength(50, ErrorMessage = "User name cannot be longer than 50 characters.")]
public string UserName { get; set; }
[Email]
[Required(ErrorMessage = "Email is required.")]
[MaxLength(100, ErrorMessage = "Email cannot be longer than 100 characters.")]
public string Email { get; set; }
[Required(ErrorMessage = "Password is required.")]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }
[MaxLength(150, ErrorMessage = "Full name cannot be longer than 150 characters.")]
public string FullName { get; set; }
public int UserTypeID { get; set; }
public virtual UserType UserType { get; set; }
public virtual ICollection<Page> Pages { get; set; }
}
和我使用这个模型只是修改某些字段(密码不应该是编辑):
public class EditUserModel
{
public long UserID { get; set; }
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Email]
[Required(ErrorMessage = "Email is required.")]
[MaxLength(100, ErrorMessage = "Email cannot be longer than 100 characters.")]
public string Email { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Full name")]
[MaxLength(150, ErrorMessage = "Full name cannot be longer than 150 characters.")]
public string FullName { get; set; }
public int UserTypeID { get; set; }
public virtual UserType UserType { get; set; }
}
但我很困惑如何将EditUserModel传递到我的数据上下文来更新它。对不起,如果看起来很简单,但我真的很难过。
这是自动生成的编辑操作,我修改:
[IsAdministrator]
[HttpPost]
public ActionResult Edit(EditUserModel user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.UserTypeID = new SelectList(db.UserTypes, "UserTypeId", "Name", user.UserTypeID);
return View(user);
}
这是我遇到的麻烦线路:
db.Entry(user).State = EntityState.Modified;
我创建的原因自定义类是避免暴露视图中的密码。
答
由于您试图保存视图模型,因此无法正常工作。
您可以使用AutoMapper将视图模型中的数据重写为您的数据模型。之后,您应该可以保存更改。
User userModel = Mapper.Map<EditUserModel, User>(user);
userModel = // todo: get password from database
// todo: attach your model to context and save changes
我使用实体框架代码第一,这种方法很好。
谢谢,但有没有另一种方式下载Automapper? – Ron
您可以从数据库上下文获取用户对象,并从视图模型中重写值。 – krolik
我试过,但db.Entry(用户).State = EntityState.Modified;将不适用于我的视图模型。 – Ron