2

我有一个局部视图,它有一个 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 中显示完整视图。

关于如何让它发挥作用的任何建议?

谢谢

4

1 回答 1

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 的值。

可能还有其他方法。也许其他人会加入。我希望这对现在有所帮助。

于 2010-02-03T17:36:20.660 回答