asp.net-mvc – Razor不会在HiddenFor中呈现隐藏的准确PK
在我的ASP MVC 4站点遇到一个奇怪的问题.如果用户打开创建表单并尝试将代理添加到我们的数据库,我们自然会首先在字段上运行验证.如果出现错误,我们会将代理保存为未完成状态,并将用户重定向回创建页面.
当用户尝试重新保存代理时出现错误.在第一个回发后,代理将保存到数据库中并生成PK.然而,在第二个回发后,PK被发送到服务器,其值为0而不是刚刚自动生成的值. 我在“创建”视图中添加了一个HiddenFor,但每次都会使用值0呈现. 我还逐步完成了代码,以确保在调用.Save之后生成PK,在调用返回View时仍然存在,并且还确保在视图处理时Model.ID属性包含相同的值渲染. 无论如何,如果我右键单击页面并查看源,隐藏字段将呈现如下: <input data-val="false" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="0" /> 模型 public partial class AgentTransmission { public int ID { get; set; } . . . } 视图 @model MonetModelFromDb.Models.AgentTransmission @{ ViewBag.Title = "Create new Agent"; } @Html.HiddenFor(model => model.CreatedDate,new { data_val = "false" }) @Html.HiddenFor(model => model.CreatedOperator,new { data_val = "false" }) @Html.HiddenFor(model => model.ReferenceNumber,new { data_val = "false" }) @Html.HiddenFor(model => model.Region,new { data_val = "false" }) @Html.HiddenFor(model => model.INDDist,new { data_val = "false" }) @Html.HiddenFor(model => model.LastChangeDate,new { data_val = "false" }) @Html.HiddenFor(model => model.LastChangeOperator,new { data_val = "false" }) @Html.HiddenFor(model => model.EditTaxId,new { data_val = "false" }) @Html.HiddenFor(model => model.ParentId,new { data_val = "false" }) @Html.HiddenFor(model => model.IsSubstat,new { data_val = "false" }) @Html.HiddenFor(model => model.ID,new { data_val = "false" }) 渲染HiddenFor部分 <input data-val="false" data-val-date="The field CreatedDate must be a date." id="CreatedDate" name="CreatedDate" type="hidden" value="" /> <input data-val="false" id="CreatedOperator" name="CreatedOperator" type="hidden" value="" /> <input data-val="false" id="Region" name="Region" type="hidden" value="NM-834" /> <input data-val="false" id="INDDist" name="INDDist" type="hidden" value="834" /> <input data-val="false" data-val-date="The field LastChangeDate must be a date." data-val-required="The LastChangeDate field is required." id="LastChangeDate" name="LastChangeDate" type="hidden" value="4/8/2015 10:43:30 AM" /> <input data-val="false" id="LastChangeOperator" name="LastChangeOperator" type="hidden" value="TYPCLS" /> <input data-val="false" data-val-required="The EditTaxId field is required." id="EditTaxId" name="EditTaxId" type="hidden" value="False" /> <input data-val="false" data-val-number="The field ParentId must be a number." id="ParentId" name="ParentId" type="hidden" value="" /> <input data-val="false" data-val-required="The IsSubstat field is required." id="IsSubstat" name="IsSubstat" type="hidden" value="False" /> <input data-val="false" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="0" /> 调节器 [HttpPost] [MonetAuthorize] public ActionResult Create(AgentTransmission agenttransmission,bool andAddAgent = false) { . . . //Determine if this is first POST or not if (agenttransmission.ID > 0) { db.Entry(agenttransmission).State = EntityState.Modified; } else { db.AgentTransmission.Add(agenttransmission); } db.SaveChanges(); //Send back to view if errors pressent if (!String.IsNullOrWhiteSpace(errorMsg)) { return View(agenttransmission); } } 编辑 如果我删除HiddenFor帮助器并简单地剪切/粘贴渲染的输入标签,我就能捕获相关的PK值.但是,这有点hacky所以我希望找到一个更优雅的解决方案(如果可能的话) <input data-val="false" id="ID" name="ID" type="hidden" value="@Model.ID" /> 解决方法
这里经常提到这个问题的变化.基本上它归结为ModelState对象以及它的值覆盖视图的实际模型上的值的事实.发布表单时,在ModelState对象中为ID属性设置0.在post操作中,您保存实体,这会导致其ID属性更新,但0仍在ModelState中.当您返回视图时,0再次被设置为ID的值,因为再次,这就是ModelState中的内容.
它以这种方式工作的原因最好用一个例子来解释.假设您有一个表单,您正在编辑现有实体,该实体的Name属性设置为“Foo”.用户在表单中将其更改为“Bar”,然后发布表单.但是,他们忽略了填写必填字段,因此错误会阻止保存更新.此时会发生什么?如果我们使用模型值,Name字段将重置为“Foo”.但是,如果使用ModelState,Name字段将保留用户对“Bar”的修改.在后一种情况下,他们只是修复错误并再次发布.在前者中,他们必须重新制作他们之前对表单所做的所有更改,这显然是一种非常糟糕的用户体验. 现在,至于如何解决这个问题.最好的方法是遵循PRG模式(Post-Redirect-Get).如果提交良好,并且您成功保存了更改,则不要返回视图,即使您希望用户能够立即进行其他更改.如果您需要,只需重定向回相同的操作,但重定向过程足以清除ModelState,以便用户现在与从数据库中提取的更新模型进行交互. 如果这不可行,那么您可以简单地清除ModelState.我建议不要完全清除它,因为你可能会引起一些非常真实的用户沮丧,如上例所示.如果你真的无法进行重定向,那么尝试只清除你真正需要的ModelState中的值. ModelState.Remove("ID"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Knockout.js – 数据绑定的javascript函数
- 如何在asp.net c中仅获取排除时间的日期#
- asp.net core中使用log4net
- 如何把asp COM组件移植到aspx
- asp.net – 它似乎是一个浏览器(或者它是visual studio吗?
- asp.net-mvc – Globalize.addCultureInfo不是一个函数
- ASP.NET / Java – 脚本注册/重定向问题
- asp.net-mvc-3 – Telerik MVC Grid中的自定义寻呼机
- ASP.NET Core 2.0 依赖注入
- asp.net-mvc – ASP.NET MVC4 CustomErrors DefaultRedirec
- asp.net-mvc – 返回ASP.Net Core MVC中的上一页
- asp.net-mvc-3 – 如何在Razor视图引擎中注册程序
- 十七点学完安全知识超级详细了解进程和病毒知识
- ASP.NET MVC – 使用ViewData将Json String传递给
- asp.net-web-api – ASP.NET核心WebAPI 404错误
- asp.net-mvc-4 – 如何在浏览器窗口调整大小时调
- asp.net-mvc – 属性级验证错误阻碍了类级验证的
- asp.net – Alpha Five Version 10如何开发Web应
- asp.net – Visual Studio IDE的开发
- asp.net – 在Visual Studio 2010 SP1中使用IIS