来自模型的不同值

Different values from model

我在 Razor 模板中有这两行:

@Html.Hidden("step", Model.Step)
<p>@Html.Label(Model.Step.ToString())</p>

它们产生两个不同的值:

<input data-val="true"
       data-val-number="The field Step must be a number."
       data-val-required="The Step field is required."
       id="step"
       name="step"
       type="hidden"
       value="0">
    <p>
        <label for="">1
        </label>
    </p>

这怎么可能?

属性 Step 属于 Int32 类型,每 POST 次操作递增。

编辑:

@model ***.WebUI.Models.OrderViewModel
@{
  ViewBag.Title = "New order";
}
<h2>
  New order</h2>
@using (Html.BeginForm())
{
  @Html.Hidden("step", Model.Step)
  <p>@Html.Label(Model.Step.ToString())</p>
  <div>
    //other inputs
  </div>
}

你没有向你展示 POST 方法,但基于 "Property Step is of a type Int32 and is incremented every POST action." 我认为它看起来像

public ActionResult Edit(OrderViewModel model)
{
  model.Step = model.Step + 1;
  return View(model);
}

当您 post 模型时,模型值会添加到 ModelState(连同任何 ModelState 错误),因此在第一个 post 中,ModelState 值的 Step 将是 0。 Html 助手使用 ModelState 值进行绑定(如果存在),因此当您 return 视图 @Html.Hidden("step", Model.Step) 将绑定到 0 的值(不是模型1 的值)。 this answer.

中解释了此行为的原因

正确的方法是遵循 PRG 模式(重定向到 GET 方法,传递一个指示 Step 值的参数并初始化一个新的 OrderViewModel),但是您可以通过清除 ModelState 以便 Html Helper 将使用模型值。

public ActionResult Edit(OrderViewModel model)
{
  ModelState.Clear(); // clear all model state
  model.Step = model.Step + 1;
  return View();
}

但是,请谨慎使用。 ModelState.Clear() 也删除了所有错误。