2

UpdateTargetID が設定された Ajax.BeginForm を持つ部分ビューがあります。フォームの検証が失敗すると、更新ターゲット 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 の結果が成功したときにリダイレクトが必要な場合は、従来の投稿を使用します。

Ajax.BeginForm ではなく jQuery を使用して送信する (または 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 に答える