我正在使用MVC3,Razor,C#,.NET4,EF5。
我有很多情况下我直接编辑域模型,是的,我知道我应该使用View Models :)但是从短期来看,我希望我能找到解决问题的方法,我就是将空值保存到数据库中,其中这些字段未在表单中指定为隐藏字段。我意识到这与模型绑定行为有关。
我的编辑操作:
public ActionResult Edit(int id)
{
StdOrg myOrg = db.StdOrg.Single(s => s.Id == id);
return View(myOrg);
}
假设我的View上有5个字段:
Name
Address1
Address2
Address3
Address4
现在我的帖子编辑操作:
[HttpPost]
public ActionResult Edit(StdOrg myOrg)
{
if (ModelState.IsValid)
{
db.StdOrg.Attach(myOrg);
db.ObjectStateManager.ChangeObjectState(myOrg, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(myOrg);
}
现在我的表记录中有10列,第6-10列有值。
Name
Address1
Address2
Address3
Address4
Terms
EmployeeNo
Code
Active
SetUpDate
当我保存表单时,第6-10列即条款等设置为null。现在我意识到这是因为我没有在视图中将它们指定为隐藏字段,因此MVC模型绑定假设它们为空。
是否有实用的方法,而不是指定表单中的所有列,出于安全原因我宁愿不这样做。
非常感谢提前。
修改
我的尝试似乎不起作用:
[HttpPost]
public ActionResult Edit([Bind(Include = "Id,Name,Name,Address1,Address2,Address3,Address4")] StdOrg myOrg)
想法...... ???
结论
对于那些感兴趣的人,我最终使用了“Value Injector”,这是另一个“Automapper”,我为此编写了一个简单的匹配例程来防止设置空值,同时也排除了导航属性。非常有用的Mapper。
仍然需要实现ViewModel,因为这些似乎是识别视图中哪个类属性的唯一方法,除非可以使Bind属性工作,但我无法工作。 否则,即使使用映射器,也无法将View字段重置为null,因为映射器将确保忽略它!就我所见,它无法在视图属性和域类中的其他人之间进行分析。
答案 0 :(得分:1)
尝试使用BindAttribute,您可以简单地排除或包含该特定操作的字段(这总是很好的做法,有人可以操作POST上的ID字段并修改不同的值)。
请参阅this question以获取示例
答案 1 :(得分:0)
尽管放置了Exclude:
[Bind(Exclude = "PropertyName,PropertyType")]
public class Filter {
public string PropertyName { get; set; }
public Type PropertyType { get; set; }
public string From { get; set; }
public string To { get; set; }
public string Match { get; set; }
}
当我从模型中调用此方法时,这些属性似乎被NULL覆盖(注意:PropertyName和PropertyType不是并且一定不能出现在标记中!它们在代码中填充一次,然后再进行标记)
[HttpPost]
public virtual PartialViewResult LoadFiltered(string entityType, IDictionary<string, Filter> filters)
当没有选择任何元素时(在界面中禁用所有过滤器) - 我得到两个元素,将“controller”和“action”作为键。什么...... ??