我的最终问题是 - 如果模型绑定器填充模型的所有,或者仅填充正在发布的位,让控制器填充其余部分?
例如,我在我的系统和表单中添加了一个产品,我希望用户选择新产品将出现在哪些网站上。因此,在我的模型中,我想填充一个名为“AllAvailableSites”的集合来呈现用户可以选择的复选框。如果表单未验证,我还需要在帖子上填充任何选定站点的模型,我需要表示显示初始选择的表单。似乎我应该让模型绑定器在模型上设置所选的站点,并且(在控制器方法中)我在模型上设置“AllAvailableSites”。听起来不错吗?在模型绑定器中设置所有内容似乎更有效,但有人建议它不太正确。
我很感激任何建议;我不得不说,所有MVC模型绑定帮助在线似乎引用了非常简单的例子,没有什么复杂的。
另外,我真的需要一个方法的GET和POST版本吗?他们不能只采用相同的视图模型吗?然后我检查我的模型绑定器是否是GET / POST,并相应地填充所有模型。
答案 0 :(得分:0)
你的初步结论是合理的。模型绑定器应该只担心创建模型的实例并使用从操作上下文中可用的值(例如,post值)填充其属性,然后执行验证。然后,您的控制器负责填充视图所需的任何其他值,例如您的可用站点列表。
我不完全确定你需要单独的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);
}
也许您想知道是否可以将它们组合成一个动作,并且只是弄清楚他们是在查看编辑表单还是在动作中发布编辑表单的结果。我强烈建议你不要这样做。有各种各样的原因,但让我们保持这一点;不要这样做。