Server.TransferRequest
あるMVCで完全に不要。これは時代遅れの機能で、ASP.NETでのみ必要でした。これは、要求が直接ページに到達し、要求を別のページに転送する方法が必要だったためです。ASP.NETの最新バージョン(MVCを含む)には、ルーティングするようにカスタマイズできるルーティングインフラストラクチャがあります。必要なリソースに直接があります。リクエストを直接コントローラーに送り、必要なアクションを実行できる場合は、リクエストをコントローラーに到達させて別のコントローラーに転送するだけの意味はありません。
さらに、元のリクエストに応答しているので、何も入力する必要がありません。TempData
、リクエストを適切な場所にルーティングするためだけに、他のストレージに。代わりに、元のリクエストをそのままにしてコントローラーアクションに到達します。このアプローチは完全にサーバー側で行われるため、Googleがこのアプローチを承認するので安心できます。
IRouteConstraint
との両方からかなりのことができIRouteHandler
ますが、ルーティングの最も強力な拡張ポイントはRouteBase
サブクラスです。このクラスは、着信ルートと発信URL生成の両方を提供するように拡張できます。これにより、このクラスは、URLとURLが実行するアクションに関係するすべてのことをワンストップで実行できます。
したがって、2番目の例に従って、からに移動/
する/home/7
には、適切なルート値を追加するルートが必要です。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Routes directy to `/home/7`
routes.MapRoute(
name: "Home7",
url: "",
defaults: new { controller = "Home", action = "Index", version = 7 }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
ただし、ランダムなページがある元の例に戻ると、ルートパラメータは実行時に変更できないため、より複雑です。したがって、RouteBase
次のようにサブクラスで実行できます。
public class RandomHomePageRoute : RouteBase
{
private Random random = new Random();
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
// Only handle the home page route
if (httpContext.Request.Path == "/")
{
result = new RouteData(this, new MvcRouteHandler());
result.Values["controller"] = "Home";
result.Values["action"] = "Index";
result.Values["version"] = random.Next(10) + 1; // Picks a random number from 1 to 10
}
// If this isn't the home page route, this should return null
// which instructs routing to try the next route in the route table.
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var controller = Convert.ToString(values["controller"]);
var action = Convert.ToString(values["action"]);
if (controller.Equals("Home", StringComparison.OrdinalIgnoreCase) &&
action.Equals("Index", StringComparison.OrdinalIgnoreCase))
{
// Route to the Home page URL
return new VirtualPathData(this, "");
}
return null;
}
}
次のようにルーティングに登録できます:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Routes to /home/{version} where version is randomly from 1-10
routes.Add(new RandomHomePageRoute());
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
上記の例では、ユーザーがアクセスしたホームページのバージョンを記録するCookieを保存して、ユーザーが戻ったときに同じホームページのバージョンを受け取ることも意味があることに注意してください。
また、このアプローチを使用すると、ルーティングをカスタマイズしてクエリ文字列パラメーターを考慮し(デフォルトでは完全に無視されます)、それに応じて適切なコントローラーアクションにルーティングできます。
追加の例
ServerTransferAction
を複製しようとしていましたか?それは本当ですか?(それに関する情報を見つけることができませんでした...質問に感謝します、ところで、以下の答えは素晴らしいです)