Asp.net mvc Hidden用于无法从视图模型中获取正确的值
我有一个多步骤的文件导入过程。我的视图中有一个隐藏的表单输入,我正试图用视图模型中的“CurrentStep”填充它Asp.net mvc Hidden用于无法从视图模型中获取正确的值,asp.net-mvc,Asp.net Mvc,我有一个多步骤的文件导入过程。我的视图中有一个隐藏的表单输入,我正试图用视图模型中的“CurrentStep”填充它 <% = Html.HiddenFor(model => model.CurrentStep) %> model.CurrentStep)%%> CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的值。另一方面,这会得到正确的值: <p><% = Model.CurrentStep %></p>
<% = Html.HiddenFor(model => model.CurrentStep) %>
model.CurrentStep)%%>
CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的值。另一方面,这会得到正确的值:
<p><% = Model.CurrentStep %></p>
我意识到我可以手工编码隐藏的输入,但我想知道:我做错了什么?是否有更好的方法跟踪发布之间的当前步骤?错误在于您试图在控制器操作中修改发布变量的值。所以我想你是想这么做的:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
html帮助程序(如HiddenFor)将始终首先使用发布的值,然后使用模型中的值
因此,您有两种可能性:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
ModelState.Remove("CurrentStep");
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
<input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
我的解决方案是使用Darin的第二个选项,因为选项1(从模型状态中清除)意味着硬编码字符串(对于复杂的模型,命名约定可能很棘手),并且希望避免使用选项3,因为我已经有很多自定义帮助器
提醒您可以使用
Html.NameFor
来保持整洁。确保您的模型属性有一个“set”操作符
回发时不会更新此内容:
@HiddenFor(m=>m.NoSeq)
除了所有这些正确答案之外,让我再加上这个简单的提醒。
注意语法
在
Razor
中,这两条语句编译时都没有错误
Html.HiddenFor(i => i.Id); //Compiles, but doesn't bind
@Html.HiddenFor(i => i.Id); //Compiles and bind
我正在努力绑定我的Id
并将其发回操作
尽管它总是空的。
我丢失了@
符号 请向我们显示您表单的代码(如Html.BeginForm()),谢谢。我认为视图模型的整个要点是将复杂的(至少比ViewData中应该包含的更复杂的)信息传递给视图。所以视图没有使用我传递给它的视图模型?它只是得到了后vars里的东西?这对我来说没什么意义。谢谢,回答得很好。对于(1),您还可以使用ModelState.Clear()删除所有值。@Darin Dimitrov:我们也遇到了类似的问题,您的帖子对我们帮助很大。但是我们没有得到,也许你有答案,就是为什么它会这样。为什么它会从POST中获取值,即使您似乎用.cshtml中的模型中的值覆盖它。因为在99.99%的情况下,用户会希望看到这样的行为:他希望看到回发后在表单中输入的相同值,而不是您在POST操作中指定的某些新值。想象一下,用户在文本框中输入了一些值,然后发生了一些模型错误,您修改了这个值并重新显示了表单。用户可能没有注意到他输入的值已被修改。这就是为什么这是默认行为的原因:因为在大多数情况下,您不应该修改用户发送给POST操作的内容。@DarinDimitrov。当然,这不是MS来决定的。如果我更改了发布的值,我是故意这样做的。为什么MVC需要覆盖我的偏好?这个功能有什么好处?如果我忽略了一些非常明显的事情,请道歉!这是对我有用的答案!我的viewmodel在几个属性上有“private set”,它们在httppost上显示为null。(在渲染视图之前,我正在参数化构造函数中设置它们)。只是将{get;private set;}更改为{get;set;}就完成了任务。
Html.HiddenFor(i => i.Id); //Compiles, but doesn't bind
@Html.HiddenFor(i => i.Id); //Compiles and bind