Подтвердить что ты не робот

Определение того, какой контроллер и действие обрабатывает определенный URL-адрес в ASP.NET MVC

Учитывая конкретный URL-адрес, как я могу точно узнать, какое действие контроллера он перенаправляется (возможно, в контексте большого приложения со многими контроллерами и сложным реестром маршрутов)?

Я не спрашиваю, как настроить маршруты.

4b9b3361

Ответ 1

Что-то вроде этого для контроллера:

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");
    }

Ответ 3

Пита,

в коде, вы можете использовать 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;

Ответ 4

Два простых шага:

  • Добавьте 2 ссылки в свой проект: MvcFakes.dll,RouteDebugger.dll
  • Введите следующий URL-адрес: /RouteDebugger

2 dll содержатся здесь

Chapter09Code.zip\Code\CS\MvcApplication1\MvcApplication1\BIN

Ответ 5

Контроллер и действие, которые используются, определяются зарегистрированными маршрутами. Посмотрите в свой файл 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);
    }
}

Ответ 6

Это зависит от маршрутов, зарегистрированных для разрешения 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.