C# HiddenFor值在POST操作后不会发回控制器
我花了很多时间为我遇到的问题找到解决办法或解决方案。我有一个类似以下原型的AJAX表单:C# HiddenFor值在POST操作后不会发回控制器,c#,asp.net-mvc,asp.net-mvc-4,asp.net-ajax,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Ajax,我花了很多时间为我遇到的问题找到解决办法或解决方案。我有一个类似以下原型的AJAX表单: @using (Ajax.BeginForm("MyAction", "Account", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = Model.MyID.ToString(), OnSuccess = "onSuccess" })) { @Html.AntiForgeryToken()
@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() })
}
好的是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);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果Test2(Test2模型)
{
var rnd=新随机数();
var random=rnd.Next(10000).ToString();
var response=string.Format(“,随机);
返回内容(响应);
}
视图:
@使用(Ajax.BeginForm(“Test2”,“Form”,新的AjaxOptions(){
HttpMethod=“POST”,
InsertionMode=InsertionMode.Replace,
UpdateTargetId=“replaceid”
}))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m=>m.MyID)
}
我找到了解决办法。我相信最好、最干净的方法是按照以下文章填充HiddenFor元素:
它既不需要ModelState清理,也不需要其他操作端的东西。这对我来说效果很好。您可能忘了在控制器中的GET方法中提供model,您能再显示一些代码吗请发布控制器操作代码…您没有提供任何代码显示您正在更新
model.MyID
。您正在返回model.CompetencyId
,请尝试在post方法中更新model.MyID
,因为隐藏字段的值为model.MyID
,使用ajax结果更改该值不会更新模型中的任何内容是,其目的是替换基于新值的值。InsertionMode.replace将替换div的内容,而不是输入的值。您可以通过将输入包装在div中并从控制器返回输入代码来完成所需的操作。检查我上面添加的示例。
[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>
}