使用MVC.NET Model Binding,视图页面模型和绑定模型是否必须是同一个类?

时间:2009-10-03 00:19:46

标签: asp.net-mvc model-binding

(也就是说,传递给视图的模型以及表单发布后返回的模型。)

如果没有,反正最好这样做吗?如果您收集的数据超出了视图页面模型的属性,该怎么办?

2 个答案:

答案 0 :(得分:0)

我对这个问题有点不清楚,如果我错了,请纠正我。我假设您正在讨论传递给视图的模型以及表单发布后返回的模型。

不,他们不必相同,但你可能会有相当多的重叠。前往视图的模型应该包含Post所需的所有字段,如果存在验证错误,则需要将这些字段重新发送回来。

我的模型是一样的,原因是我使用的模型通常只包含与表单元素相对应的属性。如果我需要额外的数据,也许是页面标题,我通常会将它直接添加到ViewData。

如果您在模型类上有额外的属性并且在Post上使用自动绑定,则会遇到以下问题:如果有人修改了传输中的Post请求并添加了与模型中未使用的属性相对应的额外数据,那么您将拥有自动绑定器绑定数据,在最坏的情况下可以用于SQL注入攻击(最好的情况是你的应用程序处于未知状态)。所以我的建议是不要这样做。如果您绝对必须,假设您有基于页面上的其他元素显示和隐藏的字段,请使用手动绑定,不要绑定不应包含数据的字段。

答案 1 :(得分:0)

当然,您可以在控制器的参数中使用不同于您发送到视图的参数,这通常非常有用。例如,我经常有一些表单,我将父实体传递给视图,但视图正在回发一个包含将成为子实体的新实例的内容的表单。您也可以从客户端处理其他字段。

模型绑定具有处理排除绑定类中的属性而不尝试从绑定

加载的属性

以下是一个例子:

public ActionResult AddComment( 
    [Bind(Exclude = "commentId"] Comment userComment, bool notifyUser
)
{

     // do stuff to add comment to the DB
     // notifyUser is a checkbox passed from client, but isn't stored in DB        

     // now return the comment view to the client but that view needs the entire thread

     var model = GetThread();
     return View("Comment", model);
}