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

时间:2013-08-20 09:46:01

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我开始为下面列出的父模型创建我的控制器。我正在为我的所有视图使用视图模型,但在我开始为Create(Post)操作添加逻辑之前,我只是点击提交,因为它认为我的viewmodel不会映射到我的模型。

令我惊讶的是它确实有效。我正在使用AutoMapper,并已将子模型的所有映射设置为相应的模型,而不是父模型(在后期结果中不存在)。 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):

@model Project.ViewModels.ParentCreateViewModel
@*EditorTemplates and such*@

控制器(获取):

public ActionResult Create()
    {
        //some list logic
        return View();
    }

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

[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);
}

我的父模型和所有子模型都正确地保存到数据库中。 MVC是否在场景绑定后做某种事情?难道不应该期待ParentCreateViewModel?

1 个答案:

答案 0 :(得分:4)

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

你的两个模型都会生成这样的表单元素:

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

...等。发布表单值时,模型绑定器会检查并找到“Child1_Name”。下划线表示子类属性。因此,选择哪个模型并不重要,因为Child1.Name是两个模型的有效属性。因此,既然您已经告诉了需要ParentModel的操作方法,那么模型绑定器会在找到它时将值应用于Child1.Name属性。