93

Ajax.BeginForm を使用して、特定のコントローラー アクションへの ajax ポストバックを実行するフォームを作成しています。アクションが成功した場合、ユーザーは別のページにリダイレクトされます (アクションが失敗した場合、ステータス メッセージが表示されますAjaxOptions UpdateTargetId)。

using (Ajax.BeginForm("Delete", null,
        new { userId = Model.UserId },
        new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
        new { name = "DeleteForm", id = "DeleteForm" }))
   {
    [HTML DELETE BUTTON]
   }

削除が成功すると、リダイレクト結果が返されます。

[Authorize]
public ActionResult Delete(Int32 UserId)
{
    UserRepository.DeleteUser(UserId);
    return Redirect(Url.Action("Index", "Home"));
}

しかし、Home Controller Index ビューが UpdateTargetId に読み込まれているため、ページ内のページになってしまいます。私が考えている2つのこと:

  1. 私はこれを間違って設計しており、このタイプのアクションを別の方法で処理する必要があります (ajax を使用しないでください)。
  2. リダイレクト結果を返す代わりに、クライアント側でリダイレクトを行う JavaScript を含むビューを返します。

#1についてコメントがある人はいますか?または、#2 が適切な解決策である場合、「JavaScript ビューのリダイレクト」はどのようになりますか?

4

15 に答える 15

174

これを達成するために使用できますJavascriptResult

リダイレクトするには:

return JavaScript("window.location = 'http://www.google.co.uk'");

現在のページをリロードするには:

return JavaScript("location.reload(true)");

最も簡単なオプションのようです。

于 2011-08-15T19:59:05.657 に答える
35

URL を含む JSON を返し、クライアント側で JavaScript を使用して window.location を変更できます。私は、サーバーから JavaScript 関数を呼び出すよりもこの方法を好みます。

サーバ側:

return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});

クライアント側:

if (response.result == 'Redirect')
    window.location = response.url;

もちろん、サーバー側でエラーが発生する可能性があるため、さらにロジックを追加できます。その場合、結果プロパティはこの状況を示し、リダイレクトを回避できます。

于 2014-07-10T15:35:46.130 に答える
15

エレガントではありませんが、特定の状況ではうまくいきます。

コントローラ

if (RedirectToPage)
    return PartialView("JavascriptRedirect", new JavascriptRedirectModel("http://www.google.com"));
else
   ... return regular ajax partialview

モデル

    public JavascriptRedirectModel(string location)
    {
        Location = location;
    }

    public string Location { get; set; }

/Views/Shared/JavascriptRedirect.cshtml

@model Models.Shared.JavascriptRedirectModel

<script type="text/javascript">
    window.location = '@Model.Location';
</script>
于 2011-07-12T05:41:50.757 に答える
13

作成しようとしている動作は、AJAX を使用して行うのが最善ではありません。AJAX は、他のページに完全にリダイレクトするのではなく、ページの一部のみを更新する場合に最適です。それは本当にAJAXの目的全体を無効にします。

あなたが説明している動作でAJAXを使用しないことをお勧めします。

または、jquery Ajax を使用して、リクエストを送信し、リクエストが完了したときにコールバックを指定することもできます。コールバックで、失敗したか成功したかを判断し、成功した場合に別のページにリダイレクトできます。jquery Ajax の方がはるかに使いやすいことがわかりました。特に、とにかく他の目的でこのライブラリを使用しているためです。

jquery ajax に関するドキュメントはこちらにありますが、構文は次のとおりです。

jQuery.ajax( options )  

jQuery.get( url, data, callback, type)

jQuery.getJSON( url, data, callback )

jQuery.getScript( url, callback )

jQuery.post( url, data, callback, type)
于 2009-10-08T15:28:20.333 に答える
7

使用JavaScriptすると間違いなく機能します。

Contentこれがよりあなたのスタイルである場合にも使用できます。

例:

MVC コントローラー

[HttpPost]
public ActionResult AjaxMethod()
{
    return Content(@"http://www.google.co.uk");
}

Javascript

$.ajax({
    type: 'POST',
    url: '/AjaxMethod',
    success: function (redirect) {
        window.location = redirect;
    }
});
于 2015-03-16T21:58:20.313 に答える
1

$.ajaxSetupを使用すると、着信応答に対してある種の ajax 応答フィルターを簡単に実行できます。応答に MVC リダイレクトが含まれている場合は、JS 側でこの式を評価できます。以下の JS のコード例:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data && typeof data == "string") {
            if (data.indexOf('window.location') > -1) {
                eval(data);
            }
        }
        return data;
    }
});

データが「window.location = '/Acount/Login'」の場合、上記のフィルターはそれをキャッチし、評価してリダイレクトを行います。

于 2016-10-27T13:24:19.037 に答える
1

正しい問題を修正する代わりに、ジョセフによる最良の回答に満足していません。彼は、これは間違ったユースケースであると言いました。実際には、たとえば古いコードベースを ajax 化されたコードに変換していて、それが必要な場合や必要な場合など、多くの場所があります。プログラミングには言い訳はありません。なぜなら、悪い開発者と良い開発者をすべてコーディングしているのはあなただけではなく、一緒に作業しなければならないからです。したがって、ajax でリダイレクトのコードを書かないと、仲間の開発者が私に解決策を強制する可能性があります。私がすべての AMD のパターン化されたサイトまたは mvc4 を使用するのが好きなのと同じように、私の会社は私を 1 年間それから遠ざけることができます。

それでは、今すぐ解決策について話しましょう。

私はかなりの ajax リクエストとレスポンス処理を行ってきましたが、私が見つけた最も簡単な方法は、ステータス コードをクライアントに送信し、それらのコードを理解するための標準的な JavaScript 関数を 1 つ用意することでした。たとえばコード 13 を単純に送信すると、リダイレクトを意味する可能性があります。

したがって、{ statusCode: 13, message: '/home/logged-in' } のような json 応答には、もちろん { status: 'success', code: 13, url: '/home/logged-in などのバリエーションが提案されています。 ', メッセージ: 'あなたは今ログインしています' }

など、標準メッセージの独自の選択まで

通常、基本コントローラークラスから継承し、このような標準応答を選択します

public JsonResult JsonDataResult(object data, string optionalMessage = "")
    {
        return Json(new { data = data, status = "success", message = optionalMessage }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonSuccessResult(string message)
    {
        return Json(new { data = "", status = "success", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonErrorResult(string message)
    {
        return Json(new { data = "", status = "error", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonRawResult(object data)
    {
        return Json(data, JsonRequestBehavior.AllowGet);
    }

Ajax.BeginForm の代わりに $.ajax を使用することについて私は Jquery ajax を使用したいと思っていますが、決定を下すのは世界中の私ではありません。しかし、私はそれと一緒に暮らす必要があります。

したがって、begin フォームにも成功コールバックがあります。jquery ajax を使用してコールバックを使用する必要はありません Ajax.BeginForm、Calls Action、Returns JSON、OnSuccess JS 関数で JSON オブジェクトにアクセスするにはどうすればよいですか?

ありがとう

于 2012-04-29T06:08:06.017 に答える
0

ベン・フォスターが言うように、Javascripts を返すと、目的のページにリダイレクトされます。

現在のページにページをロードするには:

return JavaScript("window.location = 'http://www.google.co.uk'");'

新しいタブにページを読み込むには:

return JavaScript("window.open('http://www.google.co.uk')");
于 2016-05-20T07:25:13.523 に答える