asp.net-mvc - 入門 - asp.net mvc 最新




RedirectとRedirectToActionの混同 (2)

ActionResultのRedirectToAction形式を使用して、MVCにアクション内とは異なるアクションを処理させることができます。 MVCは現在のアクションを放棄し、あたかもあなたのリダイレクト先のアクションに経路が直接導かれたかのように要求を処理します。 基本的に、これは標準のASP.NETアプリケーションでServer.Transferを呼び出すのと同じです。

これは間違いです。

RedirectToRouteResult(RedirectToAction)とRedirectResultはどちらも302リダイレクトを実行し、その結果ブラウザ内のURLが変更されます。

URLを変更せずにIndexの結果を返すには、コードは実際には次のようになります。

public ActionResult FindID(int? id)
{
    if (!id.HasValue)
        return View("index");
    ViewData["Message"] = "ID is " + id.ToString();
    return View();
}

ただし、この方法はお勧めしません。 mysite.com/products/some-product要求してmysite.com/products/some-productsome-productが存在しない場合は、関連するステータスコード(検索エンジンにとっても重要)を使用してそのことをユーザーに通知する必要があります。

FindIDアクションの唯一の目的がidパラメーターを使用して何かをすることである場合、それはNULL可能/オプションではありません。 この方法では、IDが指定されていないとFindIDアクションは呼び出されません。

私はMS証明書(70-515)を勉強しています。
私はオンラインで見つけたものと模擬テストで読んだものに混乱しています。
SOに関するいくつかの質問では、RedirectToActionを使用してブラウザに302を送信しているため、アドレスバーのURLを変更していると述べています。

しかし、これは模擬テストの1つからの質問です。

質問:

MVCホームコントローラーには現在、デフォルトのインデックスアクションしかありません。 関連コードは、次のコード例に示されています。

public ActionResult Index()
{
    ViewData["Message"] = "Hello!";
    return View();
}

パスの一部として入力されたIDパラメータを表示するFindIDという名前のアクションを作成する必要があります。 パスにIDパラメータが含まれていない場合、ASP.NETはブラウザのアドレスバーのURLを変更せずにIndexアクションを処理しなければならず、例外をスローしてはなりません。 どのコードセグメントを使うべきですか?

正解:

public ActionResult FindID(int? id)
{
    if (!id.HasValue)
        return RedirectToAction("Index");
    ViewData["Message"] = "ID is " + id.ToString();
    return View();
}

説明:

ActionResultのRedirectToAction形式を使用して、MVCにアクション内とは異なるアクションを処理させることができます。 MVCは現在のアクションを放棄し、あたかもあなたのリダイレクト先のアクションに経路が直接導かれたかのように要求を処理します。 基本的に、これは標準のASP.NETアプリケーションでServer.Transferを呼び出すのと同じです。

Redirect ActionResultは "HTTP Error 302 - Found"応答をブラウザに送信します。これにより、ブラウザは指定されたURLをロードします。 これにより、アドレスバーに表示されるアドレスが変更されます。

そう:
- RedirectToActionはURLをブラウザ内にそのまま残しますか。
- リダイレクトはブラウザのURLを変更しますか?
- 模擬テストの説明は正しいですか。 それから、私はRedirectToActionが302をしないことを理解しています。


RedirectToActionメソッドのドキュメンテーションはそれが302応答を送ることを私達に告げています:

「ブラウザにHTTP 302応答を返します。これにより、ブラウザは指定されたアクションに対してGET要求を実行します。」

dll内のコードを調べると、 RedirectToRouteResultオブジェクトが返されてRedirectToRouteResultが発生することがわかります。そのため、ドキュメントは正しいです。

protected internal virtual RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues) {
  RouteValueDictionary routeValueDictionaries;
  if (this.RouteData == null) {
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, null, routeValues, true);
  } else {
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, this.RouteData.Values, routeValues, true);
  }
  return new RedirectToRouteResult(routeValueDictionaries);
}

テストの質問に対する正しい答えは、別の見方をすることです。

public ActionResult FindID(int? id) {
  if (!id.HasValue) {
    ViewData["Message"] = "Hello!";
    return View("Index");
  }
  ViewData["Message"] = "ID is " + id.ToString();
  return View();
}

これは、パラメータなしの呼び出しView()によって返されるビューFindID代わりに、ビューIndexを使用します。





asp.net-mvc