Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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# Html.begin的奇怪行为_C#_Asp.net Mvc 3_Forms_Post - Fatal编程技术网

C# Html.begin的奇怪行为

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

让我们创建空的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="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();
    ...