【问题标题】:Submitting a model to action that is different from view model's type将模型提交给不同于视图模型类型的操作
【发布时间】:2015-01-20 03:23:18
【问题描述】:

我有两个模型:

public class PersonViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
}

public class DetailViewModel
{
     public IEnumerable<string> Titles { get; set; }
     public PersonViewModel Person { get; set; }         
}

表单显示有两个字段,第一个字段是Name,第二个字段是Titles(先生、小姐等)的下拉列表

此页面的视图被强类型化为DetailViewModel,并且控制器中的Save 方法接受PersonViewModel 类型的参数。

由于视图被强类型化为与表单操作的参数类型不同的类型,因此 HttpRequest 中的名称与 MVC 期望的操作不匹配。

是否可以让 MVC 与模型不匹配正确绑定而无需手动指定表单字段名称? (例如,我仍然想使用@Html.TextBoxFor(m =&gt; m.Person.Name)

为了澄清,正在提交的表单字段名称类似于以下内容:

Person.Name=Matthew&Person.Title=先生

我需要以下内容(模型绑定才能工作):

姓名=马修&职务=先生

【问题讨论】:

  • 你的保存方法不能接受DetailViewModel吗?
  • 我可以,但是当我必须进行验证时,事情开始变得一团糟。实际发布的数据是 Person 内的所有内容,仅此而已。

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

可以在action方法中使用BindAttributePrefix属性

public ActionResult Edit([Bind(Prefix="Person")]PersonViewModel model)
{
}

这实质上是在绑定时从属性名称中去除 Person 前缀

【讨论】:

  • 那很快!这看起来正是我想要的。超时后我会接受。
  • 我有一个问题。一般来说,BindAttribute 可以用来强制 MVC 接受与视图中处理的模型不同的模型吗?
  • 只有模型的一个子集传递给视图。除了Prefix 之外,BindAttribute 还可以将IncludeExclude 模型属性从绑定过程中。不确定您的想法,但如果您想更好地控制绑定过程,您可以随时创建自己的自定义 ModelBinder
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多