在 POST 操作后,隐藏的 For 值不会回发到控制器

本文关键字:控制器 For 操作 POST 隐藏 | 更新日期: 2023-09-27 18:35:07

我花了很多时间来寻找解决方法或解决方案来解决我遇到的问题。我有一个 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")等的帖子,但它们甚至没有帮助!

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

在 POST 操作后,隐藏的 For 值不会回发到控制器

您没有指定插入模式,默认值为替换。看起来您用控制器中的纯文本替换了隐藏的输入。在 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>
}

问候

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

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

它既不需要 ModelState 清理,也不需要其他操作端的东西。它对我来说效果很好。

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