C# MVC模型属性

C# MVC模型属性,c#,asp.net-mvc,model-binding,C#,Asp.net Mvc,Model Binding,我的最终问题是-模型绑定器应该填充模型的所有部分,还是只填充正在发布的位,让控制器填充其余部分 例如,我在我的系统中添加了一个产品,并希望用户在表单上选择新产品将出现在哪些网站上。因此,在我的模型中,我希望填充一个名为“AllAvailableSites”的集合,以呈现供用户选择的复选框。我还需要用帖子上的任何选择的站点填充模型,以防表单无法验证,并且我需要表示显示初始选择的表单。似乎我应该让模型绑定器在模型上设置所选的站点,并且(在控制器方法中)在模型上设置“AllAvailableSites

我的最终问题是-模型绑定器应该填充模型的所有部分,还是只填充正在发布的位,让控制器填充其余部分

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

我很感激你的建议;我不得不说,所有的MVC模型绑定在线帮助似乎都引用了非常简单的例子,并不复杂


另外,我真的需要方法的GET和POST版本吗?他们不能只采用相同的视图模型吗?然后我检查我的模型活页夹是否是GET/POST,并相应地填充所有模型。

您的初步结论是正确的。模型绑定器应该只关心创建模型的实例,并使用它从操作上下文中可用的值(例如,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);
}

也许您想知道是否可以将它们合并到一个操作中,并确定它们是否正在查看编辑表单或在操作中发布编辑表单的结果。我强烈鼓励你不要这样做。原因是多方面的,但我们还是保持现状吧;不要这样做。

你的初步结论是正确的。模型绑定器应该只关心创建模型的实例,并使用它从操作上下文中可用的值(例如,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);
}

也许您想知道是否可以将它们合并到一个操作中,并确定它们是否正在查看编辑表单或在操作中发布编辑表单的结果。我强烈鼓励你不要这样做。原因是多方面的,但我们还是保持现状吧;不要这样做。

你真的能分辨出什么东西是已经收到还是邮寄了吗?编辑:是的,你仍然可能是一个可怕的想法。你能发布你的GET和post方法吗?你真的能分辨出是GET还是post?编辑:是的,你仍然可以是一个可怕的想法。你可以发布你的获取和发布方法吗?谢谢你的回复。我只是想澄清一下,单独的GET/POST方法是指在GET或POST时使用单独的控制器方法进行编辑。我想知道您的编辑方法的GET版本,因为它采用了一个模型实例,它将在我的模型绑定器类中运行,即使它是GET,但没有填充任何内容-我可以检查它是否是我的模型绑定器中的GET/POST,并省去检查不存在的内容的麻烦吗?我猜控制器然后从DB而不是模型绑定器加载实体?你可以,但你不应该这样做。它应该跳过它没有值的属性。绑定器通常使用ValueProvider,它可以解析来自表单post、JSON post、查询字符串参数等的值。绑定器应该遍历模型上的每个合格属性,并尝试从ValueProvider获取值。如果没有,它应该跳过它。嗯,我刚刚检查了模型活页夹中的Request.Form。我不愿意使用默认绑定,因为我的表单非常复杂,它上的大多数控件都会被复制(即如果我的产品将在3个站点上显示,那么每个站点的描述都会有所不同,因此我的表单上有3个控件,分别称为description\u Site1、description\u Site2等)。站点的数量可能会有所不同,因此模型不能为每个站点都有一个简单的属性,需要一个列表。还有一个网格,稍后会出现在页面上,可以动态添加额外的行-我只是不相信defaultmodelbinder…我应该吗?对不起,伙计,我确定这对你来说都是基本的东西,我想我需要上一门课!(当然,mvc网站上没有太多好的文献)。谢谢你的帮助,我很感激。没问题。在模型绑定、验证和值提供程序的工作方式上,很容易被扭转过来,只需说“去他的,我会用我自己的覆盖它”。然而,在大多数情况下,您可以通过一点知识和一些重构让它为您完成大部分工作。即使您真的需要使用自己的活页夹,您也可能希望它从DefaultModelBinder派生,以便您可以使用一些内置逻辑来获取值、验证等。如果您发布模型并指出存在的问题,我相信我们可以解决。感谢您的回复。我只是想澄清一下,单独的GET/POST方法是指在GET或POST时使用单独的控制器方法进行编辑。我想知道你的名字