繁体   English   中英

发布表单时控制器中的模型绑定-为什么使用视图模型而不是域模型中的类?

[英]Model binding in controller when form is posted - why to use view model instead of class from domain model?

我仍然对ASP.NET MVC 3还是相当陌生。我遇到过视图模型及其用于将数据从控制器传递到视图的用途。 在我最近关于模型绑定的问题中,两位专家建议我也应将视图模型也用于模型绑定。

这是我以前从未遇到过的事情。 但是,两个人都向我保证,这是最佳实践。 有人可能会阐明为什么视图模型更适合于模型绑定的原因?

这是一个示例情况:我的域模型中有一个简单的类。

public class TestParent
{
    public int TestParentID { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }
}

这是我的控制器:

public class TestController : Controller
{
    private EFDbTestParentRepository testParentRepository = new EFDbTestParentRepository();
    private EFDbTestChildRepository testChildRepository = new EFDbTestChildRepository();

    public ActionResult ListParents()
    {
        return View(testParentRepository.TestParents);
    }

    public ViewResult EditParent(int testParentID)
    {
        return View(testParentRepository.TestParents.First(tp => tp.TestParentID == testParentID));
    }

    [HttpPost]
    public ActionResult EditParent(TestParent testParent)
    {
        if (ModelState.IsValid)
        {
            testParentRepository.SaveTestParent(testParent);
            TempData["message"] = string.Format("Changes to test parents have been saved: {0} (ID = {1})",
                                                        testParent.Name,
                                                        testParent.TestParentID);
            return RedirectToAction("ListParents");
        }
        // something wrong with the data values
        return View(testParent);
    }
}

因此,在HTTP POST到达时调用的第三个action方法中,我使用TestParent进行模型绑定。 感觉很方便,因为生成HTTP POST请求的浏览器页面包含TestParent所有属性的输入字段。 我实际上认为这也是Visual Studio为CRUD操作提供的模板的工作方式。

但是,我得到的建议是第三个操作方法的签名应读取public ActionResult EditParent(TestParentViewModel viewModel)

起初听起来很吸引人,但是随着您的模型和视图操作变得越来越复杂,您开始看到对大多数(尤其是所有输入)使用ViewModels的价值,尤其是输入场景。

  • 情况1-大多数Web框架容易发布过多信息。 如果直接绑定到域模型,则很有可能会过度发布数据并恶意更改不属于用户的内容。 我发现绑定到输入视图模型比白名单或黑名单的长字符串列表更干净,尽管绑定接口还有一些其他有趣的方式。

  • 案例2-随着您输入的复杂性增加,您会遇到有时需要不直接在域模型中提交和验证字段的麻烦(“我同意”复选框等)

  • 案例3-更多的是个人的事情,但是我发现绑定到关系域对象的模型有时会非常痛苦。 与使用MVC的Modelbinder处理复杂的对象图相比,在AutoMapper中将它们链接起来更容易。 与深层关系模型相比,MVC的html帮助器在处理原始类型时也更加顺畅。

使用ViewModels的缺点是它不是很干。

因此,故事的寓意是,绑定域模型对于简单的事情可能是可行的解决方案,但是随着复杂性的增加,拥有一个单独的视图模型然后在两者之间进行映射变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM