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

Здесь у вас есть ленивая оцененная версия этого алгоритма, закодированная в C #:

    static bool nextCombination(int[] num, int n, int k)
    {
        bool finished, changed;

        changed = finished = false;

        if (k > 0)
        {
            for (int i = k - 1; !finished && !changed; i--)
            {
                if (num[i] < (n - 1) - (k - 1) + i)
                {
                    num[i]++;
                    if (i < k - 1)
                    {
                        for (int j = i + 1; j < k; j++)
                        {
                            num[j] = num[j - 1] + 1;
                        }
                    }
                    changed = true;
                }
                finished = (i == 0);
            }
        }

        return changed;
    }

    static IEnumerable Combinations<T>(IEnumerable<T> elements, int k)
    {
        T[] elem = elements.ToArray();
        int size = elem.Length;

        if (k <= size)
        {
            int[] numbers = new int[k];
            for (int i = 0; i < k; i++)
            {
                numbers[i] = i;
            }

            do
            {
                yield return numbers.Select(n => elem[n]);
            }
            while (nextCombination(numbers, size, k));
        }
    }

И тестовая часть:

    static void Main(string[] args)
    {
        int k = 3;
        var t = new[] { "dog", "cat", "mouse", "zebra"};

        foreach (IEnumerable<string> i in Combinations(t, k))
        {
            Console.WriteLine(string.Join(",", i));
        }
    }

Надеюсь, это поможет вам!

16
задан alex 9 March 2017 в 20:16
поделиться

6 ответов

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

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");
    }
16
ответ дан 30 November 2019 в 21:10
поделиться

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

0
ответ дан 30 November 2019 в 21:10
поделиться

Можно попробовать вот это ASP.NET Routing Debugger:

alt text
(источник: haacked.com)

9
ответ дан 30 November 2019 в 21:10
поделиться

pete,

в коде, вы можете использовать фильтр действий, чтобы определить, что происходит:

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;

2
ответ дан 30 November 2019 в 21:10
поделиться

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

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

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

Chapter09Code.zip\Code\CS\MvcApplication1\MvcApplication1\bin

1
ответ дан 30 November 2019 в 21:10
поделиться

Контроллер и действие, которые используются, определяются зарегистрированными маршрутами . Загляните в свой 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);
    }
}
0
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: