我的设置类不超过ID
,Name
,Value
。
我已经完成了一个基本的控制器脚手架模板,效果很好。
默认代码为:
[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
,但是,我不能说我完全明白......我需要了解新功能。
答案 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