【问题标题】:Mvc Areas-Controller-Action Listing for URL Authorize用于 URL 授权的 Mvc 区域-控制器-操作列表
【发布时间】:2018-06-05 13:33:44
【问题描述】:

它可以是不同的方法。因此,我想从应用程序中获取所有 url。

我计划在我的应用程序中授权。而且,我需要这些(区域名称、控制器名称、操作名称)来询问何时发出请求。简而言之,就是 URL 地址。我试过这些。

示例:

  • 试用(区域注册)
    • 试用1控制器
      • Home ActionResult    >>> /Trial/Trial1/Home/
      • A ActionResult          >>> /Trial/Trial1/A/
      • B ActionResult          >>> /Trial/Trial1/B/
    • Trial2Controller
  • 示例(区域注册)
    • Examp1控制器
      • Home ActionResult    >>> /Examp/Examp1/Home/
      • 一个动作结果; >>> /Examp/Examp1/A/
    • Examp2 控制器
      • Home ActionResult    >>> /Examp/Examp2/Home/
var areas = Assembly.GetExecutingAssembly().GetTypes().Where(type => typeof(AreaRegistration).IsAssignableFrom(type)).ToList();
foreach(var area in areas)
{
    var controllers = Assembly.GetExecutingAssembly().GetTypes().Where(type => typeof(Controller).IsAssignableFrom(type)).ToList();
    foreach (var controller in controllers)
    {
         var methods = controller.GetMethods(BindingFlags.Public | BindingFlags.Instance);
         foreach (var method in methods)
         {
              if (method.ReturnType == typeof(ActionResult))
              {
                    lstControllerActions.Add(string.Format("Area -> Controller -> Action : {0} -> {1} -> {2}", area.Name, controller.Name, method.Name));
              }
         }
     }
}

lstControllerActions 结果:

  • 区域 -> 控制器 -> 动作:试用 -> 试用 1 -> 主页
  • 区域 -> 控制器 -> 动作 : Trial -> Trial1 -> A
  • 区域 -> 控制器 -> 动作:试用 -> 试用 1 -> B
  • 区域 -> 控制器 -> 操作:试用 -> 示例 1 -> 主页
  • 区域 -> 控制器 -> 操作:试用 -> 示例 1 -> A
  • 区域 -> 控制器 -> 操作:试用 -> 示例 2 -> 主页
  • 区域 -> 控制器 -> 动作:Examp-> Trial1 -> Home
  • 区域 -> 控制器 -> 动作 : Trial -> Trial1 -> A
  • 区域 -> 控制器 -> 动作:试用 -> 试用 1 -> B
  • 区域 -> 控制器 -> 操作:试用 -> 示例 1 -> 主页
  • 区域 -> 控制器 -> 操作:试用 -> 示例 1 -> A
  • 区域 -> 控制器 -> 操作:试用 -> 示例 2 -> 主页

一切都很漂亮,但是,区域之间没有连接控制器。

帮助

【问题讨论】:

  • 请回答问题..

标签: c# asp.net-mvc asp.net-mvc-4 url model-view-controller


【解决方案1】:

这个问题解决了。引自 @kamal-hamidi,谢谢。

quote is here

public virtual ActionResult Index()
{
    var list = GetSubClasses<Controller>();

    // Get all controllers with their actions
    var getAllcontrollers = (from item in list
        let name = item.Name
        where !item.Name.StartsWith("T4MVC_") // I'm using T4MVC
        select new MyController()
        {
            Name = name.Replace("Controller", ""), Namespace = item.Namespace, MyActions = GetListOfAction(item)
        }).ToList();

    // Now we will get all areas that has been registered in route collection
    var getAllAreas = RouteTable.Routes.OfType<Route>()
        .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
        .Select(
            r =>
                new MyArea
                {
                    Name = r.DataTokens["area"].ToString(),
                    Namespace = r.DataTokens["Namespaces"] as IList<string>,
                }).ToList().GroupBy(x => x.Name).Select(g => g.First()).ToList();

    // Add a new area for default controllers
    getAllAreas.Insert(0, new MyArea()
    {
        Name = "Main",
        Namespace = new List<string>()
        {
            typeof (Web.Controllers.HomeController).Namespace
        }
    });


    foreach (var area in getAllAreas)
    {
        var temp = new List<MyController>();
        foreach (var item in area.Namespace)
        {
            temp.AddRange(getAllcontrollers.Where(x => x.Namespace == item).ToList());
        }
        area.MyControllers = temp;
    }

    return View(getAllAreas);
}

private static List<Type> GetSubClasses<T>()
{
    return Assembly.GetCallingAssembly().GetTypes().Where(
        type => type.IsSubclassOf(typeof(T))).ToList();
}

private IEnumerable<MyAction> GetListOfAction(Type controller)
{
    var navItems = new List<MyAction>();

    // Get a descriptor of this controller
    ReflectedControllerDescriptor controllerDesc = new ReflectedControllerDescriptor(controller);

    // Look at each action in the controller
    foreach (ActionDescriptor action in controllerDesc.GetCanonicalActions())
    {
        bool validAction = true;
        bool isHttpPost = false;

        // Get any attributes (filters) on the action
        object[] attributes = action.GetCustomAttributes(false);

        // Look at each attribute
        foreach (object filter in attributes)
        {
            // Can we navigate to the action?
            if (filter is ChildActionOnlyAttribute)
            {
                validAction = false;
                break;
            }
            if (filter is HttpPostAttribute)
            {
                isHttpPost = true;
            }

        }

        // Add the action to the list if it's "valid"
        if (validAction)
            navItems.Add(new MyAction()
            {
                Name = action.ActionName,
                IsHttpPost = isHttpPost
            });
    }
    return navItems;
}

public class MyAction
{
    public string Name { get; set; }

    public bool IsHttpPost { get; set; }
}

public class MyController
{
    public string Name { get; set; }

    public string Namespace { get; set; }

    public IEnumerable<MyAction> MyActions { get; set; }
}

public class MyArea
{
    public string Name { get; set; }

    public IEnumerable<string> Namespace { get; set; }

    public IEnumerable<MyController> MyControllers { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多