我是根据ASP.NET Music Store项目中使用的模式构建我的网站,但我在编辑用户记录方面遇到了一些麻烦。
我的观点使用PasswordFor
作为密码字段,有些字段需要我的网站更新,而无需任何可能的用户干预(用于审核)。
我的问题是因为我没有提供密码或审核字段的值,所以他们提交的是空值。
这是我的帖子:
[HttpPost]
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
try
{
// supply the Company and Role information by the PK values submitted on the view
user.Company = db.Companies.Single(x => x.CompanyId == user.CompanyId);
user.Role = db.Roles.Single(x => x.RoleId == user.RoleId);
// add the auditing information
user.ModifiedBy = String.Format("{0} {1}", Convert.ToString(Session["firstname"]), Convert.ToString(Session["lastname"]));
user.ModifiedOn = DateTime.Now;
// save the record
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return Json(new
{
Message = "Success",
IsOK = bool.TrueString
});
}
catch (Exception ex)
{
if (Request.IsAjaxRequest())
{
ThrowError(ex, "EDIT");
}
else
{
return RedirectToAction("Index");
}
}
}
return View(user);
}
因此,当我提交时,因为我不想更改密码,我将其留空,这意味着该模型获得了空值。
如何确保我不会更改的字段不会更新?
答案 0 :(得分:0)
首先,您应该在表单中提供一些隐藏字段,用于存储实体的ID。
然后在您的控制器POST操作中,您应该以某种方式将原始实体与视图中所做的更改合并。所以你应该做以下的步骤:
对于第二步,您可以使用映射工具,例如 - https://automapper.codeplex.com/
或多或少看起来应该是这样的:
var updated = SomeClass.GetByKey(key);
Mapper.CreateMap<ViewModel, Model>()
.ForMember(dest => dest.someField, opt => opt.Ignore())
.ForMember(dest => dest.someField2, opt => opt.Ignore());
Mapper.Map(model, updated);
//Here save changes
(通过说我认为的视图模型或查看与您的视图绑定的模型的模型或实例)。