在视图或控制器中设置模型属性?

时间:2011-06-24 02:12:47

标签: asp.net-mvc model-view-controller performance

假设您有模型TeddyBear的创建视图和控制器。让我们假装TeddyBear有一个可选的MommyBear属性(int),它以id身份传递(通过查询字符串或仅"example.com/Bears/Create/#"

我可以通过两种方式在新MommyBear上设置TeddyBear属性:

在视图中,使用

@{
    ViewBag.Title = "Create";
    Model.MommyBear = Request["id"];
}

或在控制器中,使用:

        [HttpPost]
        public ActionResult Create(TeddyBear bear, int id)
        {
            bear.MommyBear = id;
            ...

这两种方法都更有效吗?使用任何一个都有危险吗?哪种是最佳做法?

3 个答案:

答案 0 :(得分:2)

我总是使用我的控制器来构建我的模型,然后让视图显示该模型,但我觉得合适。要回答您的问题,请在控制器内部设置属性以获得最佳实践,如果您的模型发生更改,则与您的视图无关。您可以使用更多模式,例如存储库模式和视图模型,但我认为这可以回答您的问题。

我尝试将所有逻辑保留在视图之外。在Bears控制器上的Create方法中,在那里设置MommyBear值,然后将其作为模型绑定到View,它已经为你设置了。 HTH! ;)

答案 1 :(得分:1)

如果你有一个在global.asax中定义的路由,比如

routes.MapRoute(
              "bear",
              "{controller}/{action}/{MommyBear}",
              new { action = "Index", MommyBear = "" }

            );

你有像

这样的行动方法
[HttpPost]
    public ActionResult Create(TeddyBear bear)
    {
        //bear.MommyBear = id;//The Property will be automatically bound to Mommybear
    } 

现在,您唯一需要做的就是将此路线置于默认路线之前。发生这种情况是因为除了其他地方(form post,json post,querystring等)之外,modelbinder还会查找routevalue字典中的模型值。但是有一点需要注意,上面的路线总是匹配,请求不会到达

"{controller}/{action}/{id}" route

你可以做另一件事http://localhost/Bear/Create?MommyBear=1和模型绑定器将从查询字符串绑定Mommybear属性。
注意我不鼓励您使用查询字符串或更改默认路由仅用于绑定目的。目的是显示模型值的填充方式

答案 2 :(得分:0)

您不应该从视图中更新模型。这是控制人的责任。

没有理由在动作方法上为“Id”添加单独的参数。只需将一个Id属性添加到您的viewmodel,ASP.NET MVC将为您处理模型绑定。