2017-08-24 14 views
1

RedirectToActionへの私の電話はRedirectToActionPermanentのように動作しています。つまり、単純に別のビューを表示するのではなく、URLが変更されています。RedirectToActionがURLを変更しています

編集:今、私はそれについて考えることを、恒久的なリダイレクトなどRedirectToAction通常行為。のように、これはおそらく正しい動作です。以下のコードでは、ModelStateが有効な場合、ユーザーに302のリダイレクトが戻されてインデックスに戻されます。しかし、RedirectToActionPermanentのポイントは何ですか?

リダイレクトはHTTPエラー用です。私はHttpErrorsControllerの特定のアクションメソッドにエラーを指すようにWeb.configを設定しました。これは、期待どおりに一時的なリダイレクトを表示することを含め、完全に動作します。 (https://localhost/ThisPageDoesntExistにはエラーページが表示されますが、URLは同じです)
HttpStatusCodeResultを返すか、HttpExceptionを返すと、どちらも期待通りに機能します。

しかし、RedirectToActionを使用してエラー処理方法に一時的にリダイレクトしようとすると、ビューは正しく表示されますが、URLは変更されます。 https://localhost/HttpErrors/404

HttpErrorsController.cs

private ViewResult ErrorView(HttpStatusCode httpStatusCode, string shortDesc, string longDesc) 
{ 
    Response.StatusCode = (int)httpStatusCode; 
    return View("HttpError", new HttpErrorViewModel(httpStatusCode, shortDesc, longDesc)); 
} 
[ActionName("404")] 
public ActionResult Error404() 
{ 
    return ErrorView(HttpStatusCode.NotFound, "Not Found", 
     "The requested resource could not be found."); 
} 
// Other identical methods for each error 

ItemController.cs

public ActionResult HttpError(HttpStatusCode status) 
{ 
    return RedirectToAction(((int)status).ToString(), "HttpErrors"); 
} 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(ItemViewModel viewModel) 
{ 
    if (!Request.IsAjaxRequest()) 
    { 
     return HttpError(HttpStatusCode.NotAcceptable); 
    } 
    if (ModelState.IsValid) 
    { 
     db.Items.Add(pm); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return PartialView("_Create", viewModel); 
} 

上記を書いて以来、私はそれはまた、引っ掛かりように私は、ちょうどHttpExceptionを投げオフ、おそらくより良いです実現してきましたELMAHによると、私はまだかなり上記の動作によって混乱しています。

答えて

0

RedirectToActionメソッドは、locationヘッダー値を持つ302応答をブラウザに返して、新しいURLとブラウザはこの新しいURLに完全に新しいhttp GET要求を行います。だからあなたが見るのは期待される行動です。

リダイレクトしないでそのままURLを保持したい場合は、RedirectResultを返さず、必要に応じてビュー結果を返します。

RedirectToActionPermanentメソッドは、301 Moved Permanentlyレスポンスをクライアントに返します。これは通常、あなたのサイトのあるページを別のページに移動して(別のURLを使って新しいページを作成し、別のページを作成する)、将来、新しいURLを使用するための呼び出しコードをクライアントが知りたいときに便利です。あなたの新しいページへのリンクを変更し、その結果を検索結果に表示するGoogle検索エンジンについて考えてみましょう。

+0

ええ、私は、 'RedirectToAction'が常にこれを行うことを通知した後に気付きました。それについて私の編集を参照してください。ビューを直接返すことについては、私はそれについて考えましたが、他のコントローラーからそのアクションメソッドを呼び出す方法がわかりません。そして 'ItemController'の中で' View( "HttpError") 'を返すことはポイントを破るでしょう。 – Sinjai

+0

カスタムエラーハンドラアトリビュート(あなたのエラーを処理する 'HandleErrorAttribute'から継承し、' OnException'メソッドでは、あなたが望むレスポンスを返すことができます) – Shyju

+0

私が知る限り、自分でビューを指定する必要があります – Sinjai

関連する問題