5

「投稿後にリダイレクト」(http://en.wikipedia.org/wiki/Post/Redirect/Get)パターンを使用して、解決する更新の問題を解決していますが、その後のURLの変更が表示されません。 POSTとそれに続くGET。

これが私の設定です:

かなり広範囲にわたるクライアント側の検証を含むフォームがあり、送信します。

@using (Html.BeginForm("AddItem", "Order", FormMethod.Post, new { Id = "addItemForm" })) 
{
    // form stuff
}

クライアント側の検証:

$('#addToOrder').click(function () {
    // do a bunch of validation stuff.
}

if (criteriaMet) {
    $('#addItemForm').submit();
}

「PASSWORD」コントローラー:

public class OrderController {

[HttpPost]
public ActionResult AddItem(long? orderId, long menuItemId) 
{
    if (oneConditionIsTrue)
    {
        return RedirectToRoute("NamedRoute1", new { RouteValueDictionary values });
    }
    else
    { 
        return RedirectToRoute("NamedRoute2", new { RouteValueDictionary values });
    }
}

public class NamedRouteController
{
    public ActionResult NamedRouteAction
    {
        // do some stuff
        if (mobile)
        {
            return View("MobileView", model);
        }
        else
        {
            return View("RegularView", model);
        }
}

POSTアクション(PASSWORD)からリダイレクトした後、GETアクションを介してリターン(いずれか)に進むことができます。このすべての後のブラウザのURLはhttp://mydomain.com/NamedRoute/NamedRouteActionであると思いますが、それはhttp://mydomain.com/Order/PASSWORDです。どうしてこれなの?RedirectToRouteはURLを変更すべきではありませんか?

私は何が欠けていますか?

4

1 に答える 1

8

コントローラーアクションがAJAXリクエストで何らかの形で呼び出されているのではないかと思います。たとえば、これはjQueryMobileなどを使用している場合に発生する可能性があります。あるいは、これを行うために作成した他のスクリプトがあるかもしれません-それはフォーム送信をハイジャックし、代わりにAJAXリクエストを送信します。また、これはAJAXリクエストであるため、クライアントブラウザーのURLが変更されることを期待することはできません。これがAJAXの要点です。同じページにとどまります。

これは、FireBugなどのjavascriptデバッグツールを使用して非常に簡単に確認できます。[ネットワーク]タブを見て、POSTリクエストがAJAXリクエストであったかどうかを確認してください。Netタブでリクエストを見つけて、次のリクエストヘッダーがあるかどうかを確認します。

X-Requested-With: XMLHttpRequest

jQueryは、送信するすべてのAJAXリクエストにこのHTTPヘッダーを追加します。

したがって、基本的に、POSTリクエストの後にリダイレクトが発生することが予想される場合は、AJAXを使用してフォームを送信しないでください。または、より正確に言うと、リダイレクトはサーバー側で発生し(FireBugで表示できるようになります-302ステータスコード)、XMLHttpRequestはこのリダイレクトに従いますが、クライアントブラウザーは現在の場所を変更しません。

于 2012-12-31T10:08:00.467 に答える