我花了很多时间为我遇到的问题找到解决方法或解决方案。我有一个类似下面原型的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")
等,但他们甚至没有帮助!
我做错了什么,对此有什么坚定的解决方案?感谢您的帮助。
答案 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方法提供模型,