我正在使用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期间不匹配,这很重要,我需要返回视图模型而不从数据库中重新检索它。
感谢您的任何建议。
答案 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)
{
}