Учитывая конкретный URL-адрес, как я могу точно узнать, какое действие контроллера он перенаправляется (возможно, в контексте большого приложения со многими контроллерами и сложным реестром маршрутов)?
Я не спрашиваю, как настроить маршруты.
Учитывая конкретный URL-адрес, как я могу точно узнать, какое действие контроллера он перенаправляется (возможно, в контексте большого приложения со многими контроллерами и сложным реестром маршрутов)?
Я не спрашиваю, как настроить маршруты.
Что-то вроде этого для контроллера:
string controller = RouteData.GetRequiredString("controller");
И для действия:
string action = RouteData.GetRequiredString("action");
Например, вы можете использовать его в своем базовом классе контроллера:
public class YouControllerBase: Controller
{
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
string controller = requestContext.RouteData.GetRequiredString("controller");
string action = requestContext.RouteData.GetRequiredString("action");
}
}
Или используйте его в global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
RouteData routeData = RouteTable.Routes.GetRouteData(
new HttpContextWrapper(HttpContext.Current));
var action = routeData.GetRequiredString("action");
}
Вы можете попробовать этот ASP.NET Routing Debugger:
(источник: haacked.com)
Пита,
в коде, вы можете использовать actionfilter, чтобы определить, что происходит:
public class AddUrlInfoToSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
// where we are now - do something with the vars in real app
var currentActionName = filterContext.ActionDescriptor.ActionName;
var currentControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var currentRouteData = filterContext.RouteData;
var currentUrlInfo = new UrlHelper(filterContext.RequestContext);
string url = RouteTable.Routes.GetVirtualPath(filterContext.RequestContext, currentRouteData.Values).VirtualPath;
}
}
}
а затем украсьте каждый контроллер, который вас интересует, как показано ниже (или поместите его на базовый контроллер):
[HandleError]
[AddUrlInfoToSessionAttribute]
public class HomeController : Controller
{
// controller stuff
}
[AddUrlInfoToSession]
public abstract class BaseController : Controller
{
}
надеюсь, что это поможет
джим
РЕДАКТИРОВАТЬ: просто прибрал пример вверх, добавив следующее к методу фильтра:
string url = RouteTable.Routes.GetVirtualPath(filterContext.RequestContext, currentRouteData.Values).VirtualPath;
Два простых шага:
MvcFakes.dll,RouteDebugger.dll
/RouteDebugger
2 dll содержатся здесь
Chapter09Code.zip\Code\CS\MvcApplication1\MvcApplication1\BIN
Контроллер и действие, которые используются, определяются зарегистрированными маршрутами. Посмотрите в свой файл Global.ascx.cs
Вот сопоставление маршрутов по умолчанию, которое входит в стандартную комплектацию с новым приложением MVC. Поэтому, если ваш url http://yourdomain/SomeSiteSection/SomeThing/, тогда MVC будет искать контроллер под названием SomeSiteSectionController и действие под названием SomeThing.
public class MvcApplication : System.Web.HttpApplication
{
//...
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
Это зависит от маршрутов, зарегистрированных для разрешения URL
Соглашения по умолчанию следующие:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
Действие индекса будет вызываться в HomeController.