在 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")
等的帖子,但它们甚至没有帮助!
我做错了什么,对此的坚定解决方案是什么?提前感谢您的帮助。
您没有指定插入模式,默认值为替换。看起来您用控制器中的纯文本替换了隐藏的输入。在 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方法中提供模型,