ASP.NET MVC 3 - 在视图中处理模型的最佳实践

时间:2011-07-06 14:35:46

标签: c# .net asp.net-mvc asp.net-mvc-3 viewstate

我正在使用ASP.NET MVC 3并且有几个页面,其中大多数View Model是只读的。示例字段将是这样的:

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>

然后我有一个字段,用户必须输入一些验证文本,如下所示:

@Html.LabelFor(model => model.Verification)
@Html.PasswordFor(model => model.Verification)

当用户提交表单并且它命中我的控制器时,除了Verification字段外,ViewModel的字段都是null。到目前为止,我解决这个问题的方法是有几个像这样的HiddenFor字段:

@Html.HiddenFor(model => model.MyField)

然而,这很快变得丑陋。有没有更好的方法来处理视图状态中的模型,所以在表单提交的POST期间,我可以得到我的所有字段?如果验证文本在POST期间不匹配,这很重要,我需要返回视图模型而不从数据库中重新检索它。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

如果没有从数据库中重新检索值,没有更好的方法。原因是因为MVC的模型绑定只查看GET或POST参数以将MyField绑定到操作的模型,如果GET / POST参数没有MyField值,那么它必须将该属性保持为null(如何知道该值应该是什么?)

为了让模型绑定器看到你的MyField值是在GET / POST参数中传递它,为了做到这一点,你必须明确地告诉你的视图表单传递值{{1 }}。视图无法自动知道在post / get参数中发送该属性。

然而你可以看到的一个想法是创建一个Razor(或Html)帮助器方法,它接受一个字段名称和一个表达式(Html.HiddenFor())并写入以下输出你:

x => x.MyField

这意味着您只需编写一行代码(类似于<div class="display-label">My Field</div> <div class="display-field">@Model.MyField</div> @Html.HiddenFor(model => model.MyField) 而不是那3行。但是,这也假设您想要执行此操作的任何地方都具有相同的div结构。

编辑:请记住有关只读字段的安全问题,因为它们不是真正的只读。如果这样做,最好从数据库中重新检索此数据数据将用于控制器中的任何内容,因为即使它只在HTML表单上读取,用户仍然可以通过操作POST / GET数据将此值设置为他们想要的任何值。

答案 1 :(得分:0)

请尝试在页面中序列化模型,然后发布帖子?这应该可以解决问题。

<%= Html.Serialize("User",Model) %>

[HttpPost]   
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm)
{

}