我有模型属性int? CaseId
public class TaskDetailsVm
{
public TaskDetailsVm(Task task)
{
CaseId = task.CaseID;
}
public int? CaseId { get; set; }
}
并在视图上
@Html.HiddenFor(x => x.CaseId) => 0
@Html.Hidden("CaseId", Model.CaseId) => 0
@Html.Hidden("qwe", Model.CaseId) => real value
<input type="hidden" id="CaseId" name="CaseId" value="@Model.CaseId" /> => real value
在浏览器中,我看到了:
<input data-val="true" data-val-number="The field CaseId must be a number." id="CaseId" name="CaseId" type="hidden" value="0">
<input id="CaseId" name="CaseId" type="hidden" value="0">
<input id="qwe" name="qwe" type="hidden" value="22906">
<input type="hidden" id="CaseId" name="CaseId" value="22906">
为什么我可以看到以下内容?我看不到任何脚本来覆盖此值。我该如何解决呢?
另外,对于第一行代码,由于某些我无法理解的原因,我看到了其他属性data-val="true"
和data-val-number="The field CaseId must be a number."
。
答案 0 :(得分:1)
这与ModelState
有关。按照此article:
ASP.NET MVC假定,如果您响应HTTP POST呈现视图,并且正在使用Html帮助器,则很可能会重新显示验证失败的表单。因此,Html帮助器实际上会在查看模型状态之前在模型状态中检查要显示在字段中的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。由于Index的[HttpPost]重载依赖于Model Binding来解析POST数据,因此ModelState已自动填充了字段的值。在我们的操作中,我们更改了Model数据(而不是ModelState),但HTML助手(即Html.Hidden和Html.TextBox)首先检查了ModelState…,因此显示了该操作接收的值,而不是我们修改的值。
现在在这种情况下:@Html.HiddenFor(x => x.CaseId, new {Value = @Model.CaseId})
,因为您正在为当前Model
明确定义一个值,所以它将显示您期望的值。在表格上的ModelState.Clear();
之后,您可以在Controller
中使用POST
,以重置模型值。