Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 3-处理视图中模型的最佳实践_C#_.net_Asp.net Mvc_Asp.net Mvc 3_Viewstate - Fatal编程技术网

C# 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的字段除验证字段外均为空。到目前为

我使用的是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)
然而,这很快就会变得丑陋。是否有更好的方法在视图状态下处理模型,以便在提交表单的过程中,我可以获取所有字段?如果在发布过程中验证文本不匹配,并且我需要返回视图模型,而无需从数据库中重新检索,这一点非常重要


谢谢您的建议。

如果不从数据库中重新检索值,就没有更好的解决方法了。原因是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的功能了解不多,但用户很可能可以查看页面的源代码,看看他们需要提供什么令牌才能使其正常工作。伪造令牌更多地用于跨站点脚本攻击,而不是用于值保护,现在有办法让它知道某个字段是否需要验证不管你是否同意。任何想要安全的东西都需要在服务器端处理,你不能依靠客户端的功能来保证安全。我最后只是在控制器中重新加载了我的对象实例。