我在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>
}
答案 0 :(得分:2)
你没有向你展示过POST方法,但是基于&#34;属性步骤属于Int32类型,并且每个POST动作都会增加。&#34; 我认为它看起来像< / p>
public ActionResult Edit(OrderViewModel model)
{
model.Step = model.Step + 1;
return View(model);
}
发布模型时,模型值会添加到ModelState
(以及任何ModelState错误),因此在第一篇文章中,ModelState
的{{1}}值将为{{ 1}}。 Html帮助器使用Step
值进行绑定(如果存在),因此当您返回视图时0
将绑定到ModelState
的值(而不是@Html.Hidden("step", Model.Step)
的模型值) 。 {O-3}中解释了导致此行为的原因。
正确的方法是遵循PRG模式(重定向到GET方法,传递指示0
值的参数并初始化新的1
),但是您可以通过清除{ {1}}以便Html Helper使用模型值。
Step
但是,请谨慎使用。 OrderViewModel
也会删除所有错误。