Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Hidden用于无法从视图模型中获取正确的值_Asp.net Mvc - Fatal编程技术网

Asp.net mvc Hidden用于无法从视图模型中获取正确的值

Asp.net mvc Hidden用于无法从视图模型中获取正确的值,asp.net-mvc,Asp.net Mvc,我有一个多步骤的文件导入过程。我的视图中有一个隐藏的表单输入,我正试图用视图模型中的“CurrentStep”填充它 <% = Html.HiddenFor(model => model.CurrentStep) %> model.CurrentStep)%%> CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的值。另一方面,这会得到正确的值: <p><% = Model.CurrentStep %></p>

我有一个多步骤的文件导入过程。我的视图中有一个隐藏的表单输入,我正试图用视图模型中的“CurrentStep”填充它

<% = 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)将始终首先使用发布的值,然后使用模型中的值

因此,您有两种可能性:

  • 从modelstate中删除该值:

    [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