我有一个局部视图,它有一个Ajax.BeginForm,并设置了UpdateTargetID。当表单上的验证失败时,更新目标ID将替换为验证错误,但是当没有验证错误时,应将用户重定向到新页面。
我的部分视图中的代码是
<div id="div_UID">
<% using (Ajax.BeginForm("FindChildByUID", new AjaxOptions { UpdateTargetId = "div_UID" } ))
{%>
<p>
<label>UID:</label>
<%= Html.TextBox("UID") %>
</p>
<input type="submit" value="Continue" />
<% } %>
</div>
</pre>
我的控制器中的代码如下
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FindChildByUID(Student student)
{
Student matchingStudent = _studentService.FindChildByUID(student.UID);
if (matchingStudent == null)
{
ModelState.AddModelError("UID", String.Format("No matching child found for the entered UID: {0}", student.UID));
return PartialView();
}
else
{
// full view
return RedirectToAction("ConfirmChildDetails", matchingStudent);
}
}
所以,因为我一直没有成功地显示它自己的完整视图,因为它总是似乎在Ajax.BeginForm中指定的UpdateTargetID div中的全视图。
关于如何让它发挥作用的任何建议?
由于
答案 0 :(得分:1)
您的AJAX帖子正在做的是发出请求并等待包含html的响应输入到页面上。配置是这样的,无论返回什么html,都会注入你命名为“div_UID”的div。
我通常会避免这样的情况,并且如果POST成功结果需要重定向,则使用传统发布。
我想你可以这样做,使用jQuery提交而不是Ajax.BeginForm(或者只是为你的Ajax.BeginForm设置一个回调函数):
function SubmitForm(form) {
$(form).ajaxSubmit({ target: "#div_to_update", success: CheckValidity });
}
function CheckValidity(responseText) {
var value = $("#did_process_succeed").val();
if (value == "True") {
window.location.replace("url_of_new_action_here");
}
}
您只需在局部视图中有一个名为“did_process_succeed”的隐藏字段,并根据控制器中的某些逻辑设置True或False值。
还有其他方法。也许其他人会插话。我希望现在有所帮助。