ajax表单的连续提交仍然在动作控制器中提供相同的数据



我使用ajax表单从列表中删除项目。我第一次提交的东西,它工作,但第二次,提交的项目的引用是不正确的:它是第一个引用仍然被使用。

这是我的ajax表单:
<div>
    <table>            
        @foreach (var item in Model.ProjectTechnology)
        {
            <tr>
                <td>@Html.DisplayFor(m => item.TechnologyID) </td>
                <td>@using (Ajax.BeginForm("RemoveLinkedTechnology", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "AddedTechnologies" })) { 
                    @Html.Hidden("projectID", item.ProjectID) 
                    @Html.Hidden("removedTechnologyID", item.TechnologyID) 
                    <input type="submit" value="Suppr" /> 
                    }</td>
            </tr>
        }
    </table>
</div>

这是我的控制器中的动作:

    [HttpPost]
    public ActionResult RemoveLinkedTechnology(int projectID, string removedTechnologyID)
    {
         // some code here...
    }

的例子:

假设我像这样进行提交:第二次提交:BB.

对于第一次呼叫:removedTechnologyID包含AA。

对于第二个调用:removedTechnologyID仍然包含AA。

任何想法?

谢谢

我怀疑在您的控制器操作中,您正在返回一个局部视图,该视图更新了您所显示的<table>的内容。现在,由于Html helper(如Hidden或TextBox)首先在绑定之前查找ModelState中的值,然后在模型中发生的事情是@Html.Hidden("removedTechnologyID", item.TechnologyID)看到模型状态中有removedTechnologyID="AA",完全忽略了模型值item.TechnologyID。因此,如果您在第一个AJAX请求之后查看DOM,就会发现所有隐藏字段的内部都有旧值。

要解决这个问题,您有3种可能性:

  1. 清除控制器动作中处于模型状态的项:

    [HttpPost]
    public ActionResult RemoveLinkedTechnology(int projectID, string removedTechnologyID)
    {
        ...
        ModelState.Remove("removedTechnologyID");
        ModelState.Remove("projectID");
        return View(...);
    }
    
  2. 不要使用helper来生成隐藏字段:

    <input type="hidden" name="projectID" value="@item.ProjectID" />
    <input type="hidden" name="removedTechnologyID" value="@item.TechnologyID" />
    
  3. 编写一个自定义Html.Hidden助手,它将首先使用模型中的值,然后查看modelstate(超出此答案的范围)

最新更新