C# Html.begin的奇怪行为
让我们创建空的asp.net mvc 3应用程序。 代码是 让我们创建名为test的共享视图。查看代码为C# Html.begin的奇怪行为,c#,asp.net-mvc-3,forms,post,C#,Asp.net Mvc 3,Forms,Post,让我们创建空的asp.net mvc 3应用程序。 代码是 让我们创建名为test的共享视图。查看代码为 @using MvcApplication1.Controllers @model MyModel @if (Model != null) { using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" })) { <div id="compareQue
@using MvcApplication1.Controllers
@model MyModel
@if (Model != null)
{
using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" }))
{
<div id="compareQuestions">
<p>@Model.Id</p>
@Html.HiddenFor(m => m.Id)
@Html.TextBoxFor(m => m.Id)
<input type="submit" value="save"/>
</div>
}
}
@使用MVCAPApplication1.控制器
@模型MyModel
@如果(型号!=null)
{
使用(Html.BeginForm(“Index1”,“Home”,FormMethod.Post,new{autocomplete=“off”}))
{
@Model.Id
@Html.HiddenFor(m=>m.Id)
@Html.TextBoxFor(m=>m.Id)
}
}
当我们第一次发布表单时,一切正常,但当它在文本框中第一次发布后重新加载时,值不正确。若我们更改此值并在控制器上保存post,我们将得到具有不正确值的模型,但不是我们输入的模型。这是怎么可能的?看起来这是正确的行为,因为您已经编写了操作方法。在视图中,您正在为相同的精确模型特性渲染文本框和隐藏字段 因此,当您在post期间将Id增加1时,您将增加文本框和隐藏字段中的值 如果希望文本框和隐藏字段在第二篇文章之后具有不同的值,则需要在模型上使用不同的属性
另一个问题可能是,由于您有两个不同的
,因此@Model.Id和@Html.HiddenFor(m=>m.Id)
之间存在显著差异
发布表单时,所有发布的值都存储在ModelState
使用HtmlHelper
方法时,它们首先从ModelState
中提取值。如果ModelState
不包含值,那么它将查看实际的m.Id
因此,当您第一次获得表单时,没有ModelState
。但是一旦发布表单,它就会将值存储到ModelState
,因此隐藏的输入使用该值而不是m.Id
如果要始终使用m.Id
,则需要清除控制器中的ModelState
:
public ActionResult Index1(MyModel model)
{
ModelState.Clear();
...
在第二篇文章中,隐藏字段的值是101吗?如果没有,什么是不正确的值,什么应该是正确的值?Model.Id所呈现的是什么?@Html.HiddenFor(m=>m.Id)
呈现了什么?那么@Html.TextBoxFor(m=>m.Id)
呢?@Model.Id是102,这是正确的,@Html.HiddenFor(m=>m.Id)和@Html.TextBoxFor(m=>m.Id)是101,这是不正确的否,你们不理解这个问题。当然,它呈现相同的值,但值是错误的 @Model.Id@Html.HiddenFor(m=>m.Id)有不同的值,但它们应该有相同的值,但实际上为什么要这样实现呢?这是验证的机制。如果提交的表单输入无效,ModelState将保存该输入,以便在重新显示表单时,字段不会为空。例如,如果我的模型需要一个int
,而您键入了abc
,则表单将重新显示,并显示abc
和一条错误消息。
public ActionResult Index1(MyModel model)
{
ModelState.Clear();
...