0

(即,您传递给视图的模型和表单发布后返回的模型。)

如果不是,那么这样做会更好吗?如果您收集的数据超出了视图页面模型的属性,该怎么办?

4

2 回答 2

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);
}
于 2009-10-03T09:53:45.463 回答
0

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

不,它们不必相同,尽管您可能会有相当多的重叠。上升到视图的模型应该包含 Post 的所有字段,因为如果出现验证错误,您需要将数据发送回来。

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

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

于 2009-10-03T09:12:17.103 回答