0

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

我做错了什么,对此有什么坚定的解决方案?我在这里先向您的帮助表示感谢。

4

3 回答 3

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>
}

问候

于 2013-10-14T12:57:05.947 回答
0

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

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

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

于 2013-10-14T14:36:10.257 回答
0

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

于 2016-04-29T13:58:30.317 回答