POST动作后,HiddenFor值不会回发给控制器

时间:2013-10-13 23:09:29

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-ajax

我花了很多时间为我遇到的问题找到解决方法或解决方案。我有一个类似下面原型的AJAX表单:

@using (Ajax.BeginForm("MyAction", "Account", new AjaxOptions() { 
    HttpMethod = "POST",
    UpdateTargetId = Model.MyID.ToString(), OnSuccess = "onSuccess" 
}))
{    
    @Html.AntiForgeryToken()

    <fieldset>
    <legend></legend>    

    @Html.HiddenFor(m => m.MyID, new { @id = Model.MyID.ToString() })

}

如您所见,HiddenFor值会根据POST操作中的值进行更新,如下面的POST操作中的代码段所示:

return Content(model.MyID.ToString());

好的是,AJAX调用更新了HiddenFor值,但在下一个POST操作中,MyID的值为零,尽管我知道它必须是非零的东西!

我阅读了很多帖子,建议Model.Clear()Model.Remove("MyID")等,但他们甚至没有帮助!

我做错了什么,对此有什么坚定的解决方案?感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您未指定InsertionMode,默认为替换。它看起来像是用控制器中的纯文本替换隐藏的输入。 在ajax请求期间,检查chrome / firefox开发人员工具栏中的“网络”选项卡。可能还有一些有用的Elements选项卡可以在请求后检查html。

编辑:

例如: 控制器:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Test2(Test2Model model)
        {
            var rnd = new Random();
            var random = rnd.Next(10000).ToString();
            var response = string.Format("<input id=\"MyID\" name=\"MyID\" type=\"hidden\" value=\"{0}\">", random);
            return Content(response);
        }

查看:

@using (Ajax.BeginForm("Test2", "Form", new AjaxOptions() { 
    HttpMethod = "POST",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "replaceid" 
}))
{    
    @Html.AntiForgeryToken()

    <input type="submit"/>

    <div id="replaceid">
        @Html.HiddenFor(m => m.MyID)
    </div>
}

问候

答案 1 :(得分:0)

我找到了解决方案。我相信最好和最干净的方法是按照以下文章填充HiddenFor元素:

http://slushanthan.blogspot.ca/2013/04/simple-aspnet-mvc-ajax-form-application.html

它既不需要ModelState清理也不需要其他动作方面的东西。它对我有用。

答案 2 :(得分:0)

您可能忘记在控制器中使用GET方法提供模型,