我有一个多步骤文件导入过程.我在视图中有一个隐藏的表单输入,我试图用视图模型中的"CurrentStep"填充.
<% = Html.HiddenFor(model => model.CurrentStep) %>
Run Code Online (Sandbox Code Playgroud)
CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的默认值.另一方面,这给了我正确的价值:
<p><% = Model.CurrentStep %></p>
Run Code Online (Sandbox Code Playgroud)
我意识到我可以手工编写隐藏的输入,但我想知道:我做错了什么?有没有更好的方法来跟踪POST之间的当前步骤?
Dar*_*rov 73
你做错了是你试图修改控制器动作中POSTed变量的值.所以我想你正在尝试这样做:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
和HiddenFor之类的html助手将始终首先使用POSTed值,然后使用模型中的值.
所以你有几种可能性:
从模型状态中删除值:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
ModelState.Remove("CurrentStep");
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
Run Code Online (Sandbox Code Playgroud)手动生成隐藏字段
<input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
Run Code Online (Sandbox Code Playgroud)编写一个自定义帮助程序,它将使用模型的值而不是正在POST的那个
我的解决方案是使用Darin的第二个选项,因为选项1(从模型状态清除)意味着对字符串进行硬编码(并且复杂模型的命名约定可能很棘手),并且想要避免选项3,因为我已经有很多自定义助手.
<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />
只是提醒您可以使用Html.NameFor
以保持清洁.
归档时间: |
|
查看次数: |
23723 次 |
最近记录: |