繁体   English   中英

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

[英]ASP.NET MVC 3 - Best practice for handling Model in View

我正在使用 ASP.NET MVC 3 并且有几个页面,其中大部分视图 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)

当用户提交表单并点击我的 controller 时,ViewModel 的字段都是 null 除了验证字段。 到目前为止,我解决这个问题的方法是有几个像这样的 HiddenFor 字段:

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

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

感谢您的任何建议。

如果不从数据库中重新检索值,没有更好的解决方法。 The reason is because MVC's model binding only looks at the GET or POST parameters to bind the MyField to the action's model, and if the GET/POST parameters don't have a MyField value then it has to keep that property as null (how else它会知道价值应该是什么吗?)

为了让 model binder 看到您的MyField值,请将其传递到 GET/POST 参数中,为此,您必须明确告诉视图的表单通过Html.HiddenFor()传递值。 视图无法自动知道在 post/get 参数中发送该属性。

但是,您可以考虑的一个想法是创建一个 Razor(或 Html)辅助方法,该方法采用字段名称和表达式( x => x.MyField )并为您编写以下 output :

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)

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

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

请尝试将Page中的Model序列化后再做一个Post? 这应该可以解决问题。

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

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM