我的最终问题是 - 模型绑定(bind)器应该填充模型的所有,还是只填充正在发布的位,让 Controller 填充其余部分?
例如,我正在我的系统中添加一个产品,并且在表单上我希望用户选择新产品将出现在哪些网站上。因此,在我的模型中,我想填充一个名为“AllAvailableSites”的集合来呈现供用户选择的复选框。我还需要用帖子上的任何选定站点填充模型,以防表单无法验证,并且我需要表示显示初始选择的表单。似乎我应该让模型联编程序在模型上设置所选站点,并且(一旦在 Controller 方法中)我在模型上设置“AllAvailableSites”。听起来对吗?在模型绑定(bind)器中设置所有内容似乎更有效,但有人认为这不太正确。
我很感激任何建议;不得不说,网上所有的MVC模型绑定(bind)帮助似乎都引用了非常简单的例子,没有什么复杂的。
此外,我真的需要方法的 GET 和 POST 版本吗?他们不能只采用相同的 View 模型吗?然后我检查我的模型 Binder 是否是 GET/POST,并相应地填充所有模型。
最佳答案
您的初步结论是正确的。模型绑定(bind)器应该只关心创建模型的实例并使用它在操作上下文中可用的值(例如,发布值)填充其属性,然后执行验证。然后,您的 Controller 负责填充 View 所需的任何其他值,例如您的可用站点列表。
我不完全确定您所说的需要单独的 GET/POST 方法是什么意思。如果您正在保存或创建模型实例,则应该发布,因此 GET 部分似乎无关紧要。除非你的意思是:
[HttpGet, ActionName("Edit")]
public ActionResult Edit(MyModel model)
{
return View(model);
}
[HttpPost, ActionName("Edit")]
public ActionResult SaveEdit(MyModel model)
{
// validate and save, then
return View(model);
}
也许您想知道是否可以将它们组合成一个操作,然后弄清楚他们是在查看编辑表单还是在该操作中发布编辑表单的结果。我强烈建议您不要这样做。原因有很多,但让我们就此保持下去;不要这样做。
关于c# - MVC 模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10120598/