Bra*_*don 5 .net c# viewstate asp.net-mvc asp.net-mvc-3
我正在使用ASP.NET MVC 3并且有几个页面,其中大多数View Model是只读的.示例字段将是这样的:
<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
Run Code Online (Sandbox Code Playgroud)
然后我有一个字段,用户必须输入一些验证文本,如下所示:
@Html.LabelFor(model => model.Verification)
@Html.PasswordFor(model => model.Verification)
Run Code Online (Sandbox Code Playgroud)
当用户提交表单并且它命中我的控制器时,除了Verification字段之外,ViewModel的字段都是null.到目前为止,我解决这个问题的方法是有几个像这样的HiddenFor字段:
@Html.HiddenFor(model => model.MyField)
Run Code Online (Sandbox Code Playgroud)
然而,这变得非常难看.有没有更好的方法在视图状态下处理模型,所以在表单提交的POST期间,我可以得到我的所有字段?如果验证文本在POST期间不匹配,这很重要,我需要返回视图模型而不从数据库中重新检索它.
谢谢你的任何建议.
如果不从数据库重新检索值,就没有更好的解决方法。原因是因为 MVC 的模型绑定只查看 GET 或 POST 参数来将其绑定MyField到操作的模型,如果 GET/POST 参数没有值,MyField那么它必须将该属性保留为 null(否则怎么办?想知道值应该是多少吗?)
为了让模型绑定器看到您的MyField值,请将其传递到 GET/POST 参数中,为此,您必须明确告诉视图的表单将值传递到 via 中Html.HiddenFor()。视图无法自动知道在 post/get 参数中发送该属性。
然而,您可以考虑的一个想法是创建一个 Razor(或 Html)辅助方法,该方法采用字段名称和表达式( )x => x.MyField并为您编写以下输出:
<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)
Run Code Online (Sandbox Code Playgroud)
这意味着您只需编写一行代码(类似于@Html.ShowReadOnlyField(x => x.MyField, "My Field")而不是那 3 行代码)。但是,这也假设您想要执行此操作的任何地方都将具有相同的 div 结构。
编辑:请记住只读字段的安全问题,因为它们并不是真正的只读。如果此数据将用于数据库中的任何内容,最好从数据库中重新检索此数据。控制器,因为即使它在 HTML 表单上是只读的,用户仍然可以通过操作 POST/GET 数据将此值设置为他们想要的任何值。