C# ASP.NET MVC 3-处理视图中模型的最佳实践
我使用的是ASP.NET MVC 3,有几个页面的大多数视图模型都是只读的。示例字段如下所示:C# ASP.NET MVC 3-处理视图中模型的最佳实践,c#,.net,asp.net-mvc,asp.net-mvc-3,viewstate,C#,.net,Asp.net Mvc,Asp.net Mvc 3,Viewstate,我使用的是ASP.NET MVC 3,有几个页面的大多数视图模型都是只读的。示例字段如下所示: <div class="display-label">My Field</div> <div class="display-field">@Model.MyField</div> @Html.HiddenFor(model => model.MyField) 当用户提交表单并点击我的控制器时,ViewModel的字段除验证字段外均为空。到目前为
<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)
当用户提交表单并点击我的控制器时,ViewModel的字段除验证字段外均为空。到目前为止,我解决这一问题的方法是为这样的字段设置几个隐藏点:
<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)
然而,这很快就会变得丑陋。是否有更好的方法在视图状态下处理模型,以便在提交表单的过程中,我可以获取所有字段?如果在发布过程中验证文本不匹配,并且我需要返回视图模型,而无需从数据库中重新检索,这一点非常重要
谢谢您的建议。如果不从数据库中重新检索值,就没有更好的解决方法了。原因是MVC的模型绑定只查看GET或POST参数,将
MyField
绑定到动作的模型,如果GET/POST参数没有MyField
值,那么它必须将该属性保持为null(否则它怎么知道该值应该是什么?)
为了让模型绑定器看到您的MyField
值,需要在GET/POST参数中传递它,为此,您必须通过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)
我的字段
@Model.MyField
@Html.HiddenFor(model=>model.MyField)
这意味着您只需编写一行代码(类似于@Html.ShowReadOnlyField(x=>x.MyField,“My Field”)
,而不是这三行代码。不过,这也假设您要执行此操作的所有地方都具有相同的div结构
编辑:请记住只读字段的安全性问题,因为它们不是真正的只读。如果这些数据将用于控制器中的任何内容,最好从数据库中重新检索这些数据,因为即使这些数据在HTML表单上是只读的,用户仍然可以通过manipul将其设置为任何他们想要的值正在发布/获取数据。请尝试在页面中序列化模型,然后进行发布?这应该可以解决问题
<%= Html.Serialize("User",Model) %>
[HttpPost]
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm)
{
}
[HttpPost]
公共操作结果寄存器([DeserializeAttribute]用户用户,FormCollection用户表单)
{
}
您是否可以使用helper@Html.AntiForgeryToken()绕过安全问题
?我对此表示怀疑。我对AntiForgeryToken的功能了解不多,但用户很可能可以查看页面的源代码,看看他们需要提供什么令牌才能使其正常工作。伪造令牌更多地用于跨站点脚本攻击,而不是用于值保护,现在有办法让它知道某个字段是否需要验证不管你是否同意。任何想要安全的东西都需要在服务器端处理,你不能依靠客户端的功能来保证安全。我最后只是在控制器中重新加载了我的对象实例。