【问题标题】:HiddenFor value is not posted back to the controller after POST actionPOST 操作后,HiddenFor 值不会回发到控制器
【发布时间】:2013-10-13 23:09:28
【问题描述】:

我花了很多时间来寻找解决方法或解决我遇到的问题的方法。我有一个如下原型的 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 操作的代码 sn-p:

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

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

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

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

【问题讨论】:

  • 你能再显示一些代码吗
  • 请发布控制器操作代码...
  • 您没有提供任何代码表明您正在更新model.MyID。您正在返回 model.CompetencyId,请尝试在您的 post 方法中更新 Model.MyID,因为隐藏字段的值是 model.MyID,并且使用 ajax 结果更改值不会更新模型中的任何内容

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


【解决方案1】:

你没有指定InsertionMode,默认是替换。看起来你用来自控制器的纯文本替换隐藏的输入。 在 ajax 请求期间检查 chrome/firefox 开发人员工具栏中的网络选项卡。请求后还可以有有用的元素选项卡来检查 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>
}

问候

【讨论】:

  • 是的,目的是根据新的值来替换值。
  • InsertionMode.Replace 将替换 div 的内容而不是输入的值。您可以通过将输入包装在 div 中并从控制器返回输入代码来做您想做的事情。检查我在上面添加的示例。
【解决方案2】:

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

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

它既不需要清理模型状态,也不需要其他动作方面的东西。对我来说效果很好。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2017-03-06
      相关资源
      最近更新 更多