(也就是说,传递给视图的模型以及表单发布后返回的模型。)
如果没有,反正最好这样做吗?如果您收集的数据超出了视图页面模型的属性,该怎么办?
答案 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);
}