【问题标题】:How to keep existing values when editing a record in mvc在 mvc 中编辑记录时如何保留现有值
【发布时间】:2015-02-04 20:38:41
【问题描述】:

我正在根据 ASP.NET 音乐商店项目中使用的模式构建我的网站,但在编辑用户记录时遇到了一些问题。

我的视图使用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);
}

所以当我提交时,因为我不想更改密码,所以我将其留空,这意味着模型得到了一个空值。

如何确保我没有更改的字段不会更新?

【问题讨论】:

  • 在POST方法中,从数据库中获取原件,然后将你需要的属性从posted模型映射到原件,并保存原件
  • 我希望有一种方法可以减少 PT...然后我就去吧
  • 您还可以根据this answer将属性标记为未修改
  • 这里评分最高的答案是最简单的解决方案:- stackoverflow.com/questions/8332594/…
  • 我第二次使用视图模型。您的数据库支持的实体根本无法用作实际模型。我希望微软真的会在他们的任何 MVC 教程中说明这一点。

标签: asp.net-mvc


【解决方案1】:

首先,您应该在表单中提供一些隐藏字段来存储实体的 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 

(我所说的视图模型是指与视图绑定的视图模型或模型实例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多