-1

使用控制器时,建议公开您的域实体还是创建模型更好。我以这个为例:

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

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

4

2 回答 2

9

使用控制器时,是否建议公开您的域实体

不,这是不可取的。

还是创建一个 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)
{
    ...
}
于 2013-03-27T07:23:27.177 回答
1

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

于 2013-03-27T07:26:27.517 回答