假设您有模型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;
...
这两种方法都更有效吗?使用任何一个都有危险吗?哪种是最佳做法?
答案 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将为您处理模型绑定。