仅编辑MVC编辑模板中的值

时间:2015-05-21 15:08:54

标签: c# entity-framework asp.net-mvc-5

我的设置类不超过IDNameValue

我已经完成了一个基本的控制器脚手架模板,效果很好。

默认代码为:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "ID,Name,Value")] ConfigOption config)
{
    if (ModelState.IsValid)
    {
        db.Entry(config).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(config);
}

我希望用户能够更改设置值,但是,在单击编辑后不是名称,因此,我从页面中删除了编辑框 - 但是,这会导致名称在保存时变为空白。 / p>

我知道我可以通过编辑if (ModelState.IsValid)部分,手动查找id然后执行我自己的映射和保存来完成我想要的操作,但是,我从第3版开始就没有触及MVC,我可以发誓更容易/编辑模板当时更整洁。

...是否有更简单的方法来修改一个字段? - 我甚至尝试从绑定部分取出Name,但是,我不能说我完全明白......我需要了解新功能。

1 个答案:

答案 0 :(得分:1)

由于HTTP是无状态的,因此您还需要为Edit方法提供名称值。 只要想一想,如果EF表示您希望该属性保持不变或者您希望将其设置为空,那么EF如何根据空名称值(您现在拥有的内容)来决定。

您可以将名称字段作为隐藏放回到视图中,但您仍然应该担心用户可以更改隐藏字段的值,或者您应该执行以下操作:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "ID,Name,Value")]     ConfigOption model)
{
  if (ModelState.IsValid)
  {
     var config=db.Configs.Find(model.ID);
     config.Value=model.Value;
     await db.SaveChangesAsync();
     return RedirectToAction("Index");
  }
  return View(config);
}

动作参数旁边的Bind属性应该可以防止被称为质量赋值/叠加的攻击。点击此处了解更多信息:http://ironshay.com/post/Mass-Assignment-Vulnerability-in-ASPNET-MVC.aspx