Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HiddenFor值在POST操作后不会发回控制器_C#_Asp.net Mvc_Asp.net Mvc 4_Asp.net Ajax - Fatal编程技术网

C# HiddenFor值在POST操作后不会发回控制器

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()

我花了很多时间为我遇到的问题找到解决办法或解决方案。我有一个类似以下原型的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() })

}
好的是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>
}