C# MVC4自动映射我的视图模型?

C# MVC4自动映射我的视图模型?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,我开始为下面列出的父模型创建控制器。我对所有视图都使用视图模型,但在我开始为创建(Post)操作添加逻辑之前,我只是点击了submit,以为我的视图模型不会映射到我的模型 令我惊讶的是,它居然奏效了。我正在使用AutoMapper,并且已经设置了子模型到相应模型的所有映射,但没有设置父模型(因为在post结果中没有)。这里发生了什么事,MVC让这样的奇迹发生了 型号: public partial class ParentModel { public int Id { g

我开始为下面列出的父模型创建控制器。我对所有视图都使用视图模型,但在我开始为创建(Post)操作添加逻辑之前,我只是点击了submit,以为我的视图模型不会映射到我的模型

令我惊讶的是,它居然奏效了。我正在使用AutoMapper,并且已经设置了子模型到相应模型的所有映射,但没有设置父模型(因为在post结果中没有)。这里发生了什么事,MVC让这样的奇迹发生了

型号:

public partial class ParentModel
    {
        public int Id { get; set; }
        public int Child1Id { get; set; }
        public int Child2Id { get; set; }
        public int Child3Id { get; set; }
        public int Child4Id { get; set; }
        //other data
        public virtual Child1 Child1 { get; set; }
        public virtual Child2 Child2 { get; set; }
        public virtual Child3 Child3 { get; set; }
        public virtual Child4 Child4 { get; set; }
    }
视图模型:

public class ParentCreateViewModel
    {
        //other data
        public Child1ViewModel Child1 { get; set; }
        public Child2ViewModel Child2 { get; set; }
        public Child3ViewModel Child3 { get; set; }
        public Child4ViewModel Child4 { get; set; }
    }
视图(Create.cshtml):

控制器(Get):

控制器(Post-我尚未将其更改为ParentCreateViewModel或自动将其映射回ParentModel):


我的父模型和所有子模型都正确地保留到数据库中。MVC是否进行某种幕后绑定?它不应该是ParentCreateViewModel吗?

默认的模型绑定器绑定到元素的名称上。由于这两个模型将共享这些属性(因此,在使用编辑器模板和HTML帮助程序时,也会共享HTML元素名称),因此它将其绑定到模型

两个模型都将生成如下的表单元素:

<input type="text" name="Child1_Name" />


……等等。发布表单值时,模型绑定器将检查并找到“Child1_Name”。下划线表示子类属性。因此,选择哪种模型并不重要,因为
Child1.Name
是这两种模型的有效属性。因此,既然您已经告诉action方法您想要一个
ParentModel
,那么当找到
Child1.Name
属性时,模型绑定器会很高兴地将该值应用于该属性。

默认模型绑定器会绑定元素的名称。由于这两个模型将共享这些属性(因此,在使用编辑器模板和HTML帮助程序时,也会共享HTML元素名称),因此它将其绑定到模型

两个模型都将生成如下的表单元素:

<input type="text" name="Child1_Name" />


……等等。发布表单值时,模型绑定器将检查并找到“Child1_Name”。下划线表示子类属性。因此,选择哪种模型并不重要,因为
Child1.Name
是这两种模型的有效属性。因此,既然您已经告诉action方法您想要一个
ParentModel
,那么模型绑定器在找到
Child1.Name
属性时会很高兴地将该值应用到该属性。

如果视图返回ParentCreateViewModel,那么当它得到与ParentModel相反的值时,Create Post方法不应该抱怨吗?或者,当视图被传递到post而不是db.ParentModels.Add(parentModel)上时,是否会发生映射?+1若要添加到此答案,您的视图(此处未显示)将由一个表单组成,HTTP将字段发回web服务器。建议您使用检查请求,以了解返回的内容。HTTP请求数据将由默认的MVC模型绑定器检查,该绑定器将尝试创建action方法中定义的模型类型的实例,并用请求值填充匹配的属性。谢谢。我的回答有点夸张。有时我忘记了人们无法理解我的想法:)如果视图返回ParentCreateViewModel,那么当它得到与ParentModel相反的结果时,CreatePost方法不应该抱怨吗?或者,当视图被传递到post而不是db.ParentModels.Add(parentModel)上时,是否会发生映射?+1若要添加到此答案,您的视图(此处未显示)将由一个表单组成,HTTP将字段发回web服务器。建议您使用检查请求,以了解返回的内容。HTTP请求数据将由默认的MVC模型绑定器检查,该绑定器将尝试创建action方法中定义的模型类型的实例,并用请求值填充匹配的属性。谢谢。我的回答有点夸张。有时我忘记了人们不能读懂我的心思:)
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ParentModel parentModel)
{
    if (ModelState.IsValid)
    {
        db.ParentModels.Add(parentModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    //some list logic
    return View(parentModel);
}
<input type="text" name="Child1_Name" />