2012-04-12 157 views
2

我的最后一个问题是这样的 - 应该在模型绑定填充模式所有,或只正在张贴位,只在控制器来填充剩下的?MVC模型属性

例如,我在我的系统中添加一个产品,并在表单上我希望用户选择新产品将出现在哪些网站上。因此,在我的模型中,我想填充名为“AllAvailableSites”的集合来呈现供用户选择的复选框。如果表单没有验证,我还需要在帖子中填入任意选定的网站,并且我需要表示显示初始选择的表单。我似乎应该让模型联编程序在模型上设置选定的站点,并且(一旦在控制器方法中)我在模型上设置“AllAvailableSites”。这听起来是对的吗?在模型绑定中设置所有内容似乎更有效,但有人认为它不太正确。

我很感激任何意见;我不得不说,所有的MVC模型绑定在线帮助似乎都引用了非常简单的示例,没有什么复杂的。

另外,我真的需要GET和POST版本的方法吗?他们不能只采用相同的视图模型吗?然后,如果它是GET/POST,则检查我的模型联编程序,并相应地填充所有模型。

+0

你真的可以知道是否有GET或POST吗?编辑:是的,你可以http://stackoverflow.com/questions/8629624/how-can-i-tell-if-a-method-is-a-result-of-a-get-or-a-post-from -inside-my-mvc-act仍然是一个可怕的想法imo – glosrob 2012-04-12 09:17:08

+0

你可以发布你的GET和POST方法吗? – mattytommo 2012-04-12 09:18:29

回答

0

您的初步结论是正确的。模型联编程序只应该担心创建模型的实例,并使用其可用的值从动作上下文(例如,后值)填充其属性,然后执行验证。然后,您的控制器负责填充视图所需的任何附加值,例如可用网站的列表。

我不完全确定你的意思是需要单独的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); 
} 

也许你想知道,如果你可以将它们组合成一个动作,只是弄清楚,如果他们正在查看编辑表单或张贴在行动中编辑表单的结果。我强烈建议你不要这样做。有各种各样的原因,但让我们保持这一点;不要这样做。

+0

谢谢你的回应。只是为了澄清,通过单独的GET/POST方法,我的意思是通过在GET或POST时使用单独的编辑器控制器方法进行编辑。我想知道你的GET版本的编辑方法,因为它需要一个模型实例,它将通过我的模型联编程序类运行,即使它是一个GET,但没有填充 - 我可以检查它的GET/POST在我的模型绑定器中,并保存检查不在那里的事情的麻烦?我猜控制器然后加载实体从数据库而不是模型联编程序? – Richard 2012-04-12 09:51:12

+0

你可以,但你不应该。它应该跳过它没有值的属性。绑定器通常使用ValueProvider,它可以解析表单发布,JSON发布,查询字符串参数等中的值。活页夹应该遍历模型中的每个合格属性,并尝试从ValueProvider获取值。如果没有,它应该跳过它。 – HackedByChinese 2012-04-12 10:03:17

+0

嗯,有我在我的模型活页夹中检查Request.Form。 Im默默使用默认绑定,因为我的表单相当复杂,其上的大多数控件将被复制(即如果我的产品将在3个网站上显示,则说明可能因每个网站而异),因此我的表单上有3个控件称为Description_Site1,Description_Site2等)。网站的数量可以变化,所以模型不能有每个简单的属性,需要一个列表。也有一个网页,稍后出现在页面上,可以在飞行中添加额外的行 - 我只是不信任defaultmodelbinder ....我应该吗? – Richard 2012-04-12 10:16:23