我有一个多步骤文件导入过程。我在视图中有一个隐藏的表单输入,我正在尝试使用视图模型中的“CurrentStep”填充。
<% = Html.HiddenFor(model => model.CurrentStep) %>
CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的默认值。另一方面,这给了我正确的价值:
<p><% = Model.CurrentStep %></p>
我意识到我可以手工编写隐藏的输入,但我想知道:我做错了什么?有没有更好的方法来跟踪POST之间的当前步骤?
答案 0 :(得分:71)
您所做错的是您尝试在控制器操作中修改POSTed变量的值。所以我想你正在尝试这样做:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
和HiddenFor之类的html帮助程序将始终首先使用POSTed值,然后使用模型中的值。
所以你有几种可能性:
从模型状态中删除值:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
ModelState.Remove("CurrentStep");
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
手动生成隐藏字段
<input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
编写一个自定义帮助程序,它将使用您的模型的值,而不是正在发布的那个
答案 1 :(得分:6)
我的解决方案是使用Darin的第二个选项,因为选项1(从模型状态清除)意味着对字符串进行硬编码(并且复杂模型的命名约定可能很棘手),并且希望避免选项3因为我已经有这么多自定义助手了。
<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />
提醒您,您可以使用Html.NameFor
来保持清洁。
答案 2 :(得分:0)
确保您的模型属性具有“设置”运算符。
这不会在回发时更新:
@ Html.HiddenFor(m => m.NoSeq)
public Class MyModel
{
int _NoSeq;
public NoSeq
{
get { return _NoSeq };
}
}
答案 3 :(得分:0)
除了所有这些正确答案之外,让我添加此简单提醒。
注意语法!
在print(d)
person_id date_1 within_id
0 101 2013-07-07 11:20:00 out of range
1 101 2013-05-07 14:30:00 ABC1
2 101 2013-06-07 14:40:00 out of range
3 101 2014-08-06 00:00:00 out of range
4 101 2014-11-06 00:00:00 out of range
5 101 2013-02-03 12:30:00 out of range
6 101 2014-06-13 00:00:00 out of range
7 202 2011-12-11 00:00:00 DEF1
8 202 2012-10-13 07:00:00 DEF2
9 202 2015-12-13 00:00:00 out of range
10 202 2012-12-13 00:00:00 DEF3
11 202 2012-12-13 18:30:00 DEF3
12 202 2011-07-13 10:00:00 out of range
13 202 2012-12-18 10:00:00 DEF3
14 202 2013-12-19 11:00:00 NaN
中,这两个语句均正确编译。
Razor
我正在努力将自己的 Html.HiddenFor(i => i.Id); //Compiles, but doesn't bind
@Html.HiddenFor(i => i.Id); //Compiles and bind
绑定并发送回Id
。
虽然总是空的。
我错过了Action
符号!