使用重写的 URL 与直接调用控制器
Use of rewritten URLs vs direct controller call
是否有一种简单的包罗万象的方法来确保只有重写的 URL 才能调用控制器?
例如,如果我们有一个URL www.somesite.com/about指向控制器"Shared"中的动作"About",是否可以确保任何对 www.somesite.com/shared/about 的请求以重写的 URL 结束,在本例中为 www.somesite.com/about?
换句话说,用户不应该只键入 /controller/action 而不会被重定向到重写的 URL.
但是,我们不想主动检查和重定向,而是希望 MVC 有一些内置功能。我在这些方面发现的唯一建议是 ChildActionOnly 和 HttpPost 属性,但它们似乎不是答案(正常链接不起作用)。
如前所述,我们正在寻找简单的、或多或少内置的东西 - 如果它不存在,那就这样吧...
内置的屏蔽路由的方法是使用IgnoreRoute
。它会使路由短路,并始终使路径抛出 404 未找到。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Ignore /Home/About
routes.IgnoreRoute("Home/About");
// Register /About
routes.MapRoute(
name: "About",
url: "About",
defaults: new { controller = "Home", action = "About" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
请注意,在幕后,它使用 StopRoutingHandler
,可以在任何自定义 Route
或 中使用(作为 MvcRouteHandler
的替代)制定比这更多的动态忽略规则。
NOTE: It is extremely important that IgnoreRoute
is registered before the route you want to ignore in the route table.
是否有一种简单的包罗万象的方法来确保只有重写的 URL 才能调用控制器?
例如,如果我们有一个URL www.somesite.com/about指向控制器"Shared"中的动作"About",是否可以确保任何对 www.somesite.com/shared/about 的请求以重写的 URL 结束,在本例中为 www.somesite.com/about?
换句话说,用户不应该只键入 /controller/action 而不会被重定向到重写的 URL.
但是,我们不想主动检查和重定向,而是希望 MVC 有一些内置功能。我在这些方面发现的唯一建议是 ChildActionOnly 和 HttpPost 属性,但它们似乎不是答案(正常链接不起作用)。
如前所述,我们正在寻找简单的、或多或少内置的东西 - 如果它不存在,那就这样吧...
内置的屏蔽路由的方法是使用IgnoreRoute
。它会使路由短路,并始终使路径抛出 404 未找到。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Ignore /Home/About
routes.IgnoreRoute("Home/About");
// Register /About
routes.MapRoute(
name: "About",
url: "About",
defaults: new { controller = "Home", action = "About" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
请注意,在幕后,它使用 StopRoutingHandler
,可以在任何自定义 Route
或 MvcRouteHandler
的替代)制定比这更多的动态忽略规则。
NOTE: It is extremely important that
IgnoreRoute
is registered before the route you want to ignore in the route table.