【问题标题】:MVC4 Automatically mapped my view model?MVC4 自动映射我的视图模型?
【发布时间】:2013-08-20 09:46:01
【问题描述】:

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

令我惊讶的是,它确实有效。我正在使用 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; }
    }

查看(创建.cshtml):

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

控制器(获取):

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

Controller(发布 - 我尚未将其更改为 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 吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果视图返回的是 ParentCreateViewModel,Create Post 方法在得到它而不是 ParentModel 时不应该抱怨吗?或者当视图传递给帖子而不是 db.ParentModels.Add(parentModel) 时是否发生映射?
    • +1 要添加到此答案,您的视图(此处未显示)将由 HTTP 将字段发送回 Web 服务器的表单组成。建议您使用fiddler 检查请求,以了解发送回的内容。默认 MVC 模型绑定器将检查 HTTP 请求数据,该绑定器将尝试创建在操作方法中定义的模型类型的实例,并使用请求值填充匹配的属性。
    • 谢谢老兄。我在回答中扩大了一点。有时我会忘记人们无法读懂我的想法:)
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多