我使用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种可能性:
-
清除控制器动作中处于模型状态的项:
[HttpPost] public ActionResult RemoveLinkedTechnology(int projectID, string removedTechnologyID) { ... ModelState.Remove("removedTechnologyID"); ModelState.Remove("projectID"); return View(...); }
-
不要使用helper来生成隐藏字段:
<input type="hidden" name="projectID" value="@item.ProjectID" /> <input type="hidden" name="removedTechnologyID" value="@item.TechnologyID" />
-
编写一个自定义
Html.Hidden
助手,它将首先使用模型中的值,然后查看modelstate(超出此答案的范围)