使用带有对象和ViewModel的控制器的MVC中的最佳实践

时间:2013-03-27 07:19:14

标签: asp.net-mvc asp.net-mvc-4

使用Controller时,建议您公开域实体,还是建立模型更好。我以此为例:

[HttpPost]
public ActionResult Create(Order order)
{
        if (SaveObject<Order>(order, false))
        {
                return RedirectToAction("Index", new { id = order.CustomerNo });
        }
        else
        {
                ViewData.Model = order;
                return View();
        }
}

如果最好公开一个模型应该包含在哪个模型中?我是否需要创建支持属性,或者可能只需要为当前用例公开我需要的字段?我遇到了“模型注入”这个术语,有人可以解释使用它的含义是什么以及它是如何完成的?

2 个答案:

答案 0 :(得分:9)

  

使用Controller时,建议公开域实体

不,这是不可取的。

  

或创建OrderViewModel是否更好。

是的,它更好。

  

如果是,我的视图模型中应包含哪些内容?

您希望由用户公开和修改的属性。

  

我遇到了“模型注入”这个术语,有人可以解释一下它的含义以及它是如何完成的吗?

想象一下以下域模型:

public class User
{
    public bool IsAdministrator { get; set; }
    public string FirstName { get; set; }
}

并且您希望有一个允许用户更改其名字的控制器操作。所以你选择:

[HttpPost]
public ActionResult Create(User user)
{
    Save(user);
    ...
}

以及相应的视图,其中您将拥有第一个名称的文本字段。用户现在可以非常轻松地模拟对控制器操作的请求,并将IsAdministrator属性设置(注入)为true。

这就是你应该使用视图模型的原因:

public class ChangeFirstNameUserModel
{
    public string FirstName { get; set; }
}

然后:

[HttpPost]
public ActionResult Create(ChangeFirstNameUserModel model)
{
    ...
}

答案 1 :(得分:1)

最好创建实体的映射模型。特别是如果您不打算修改实体的每个属性。而且,如果你的实体有子对象并且你没有急于加载它们,如果你正在使用ORM(例如EF,NHibernate),那么你就有可能拥有select n+1 issue。您的模型还应该只包含您想要更新的属性,这样您就不会有过度发布。