【问题标题】:MVC Attribute RoutingMVC 属性路由
【发布时间】:2014-08-16 18:14:19
【问题描述】:

是否可以在运行时修改模板路由。

例子:

[Route("Home/Index")]
public View Index()
{
   return View();
}

我已经看到新的 IDirectRouteProvider 可以模板没有设置器。

我可以在其他地方这样做吗?

谢谢

史蒂夫

【问题讨论】:

    标签: c# asp.net-mvc-5 attributerouting asp.net-mvc-5.2


    【解决方案1】:

    没关系,

    我就是这样做的,创建了我自己的路由提供者

    public class CoreEntityDirectRouteProvider : DefaultDirectRouteProvider
    {
        public CoreEntityDirectRouteProvider()
        {
            CoreEntity = Resource.CORE_ENTITY_NAME;
        }
    
        public string CoreEntity { get; private set; }
    
        protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor)
        {
    
            IReadOnlyList<IDirectRouteFactory> actionRouteFactories = base.GetActionRouteFactories(actionDescriptor);
    
            List<IDirectRouteFactory> actionDirectRouteFactories = new List<IDirectRouteFactory>();
            foreach (IDirectRouteFactory routeFactory in actionRouteFactories)
            {
                RouteAttribute routeAttr = routeFactory as RouteAttribute;
                if (routeAttr != null && !string.IsNullOrEmpty(routeAttr.Template))
                {
                    string template = routeAttr.Template;
    
                    if (template.Contains("{{CORE_ENTITY}}"))
                    {
                        template = template.Replace("{{CORE_ENTITY}}", CoreEntity);
                    }
                    RouteAttribute routeAttribute = new RouteAttribute(template);
                    routeAttribute.Order = routeAttr.Order;
                    routeAttribute.Name = routeAttr.Name;
                    actionDirectRouteFactories.Add(routeAttribute);
                }
            }
    
            return actionDirectRouteFactories.ToSafeReadOnlyCollection();
        }
    }
    

    然后我在RouteConfig中调用MapMvcAttributeRoutes的时候使用它,像这样:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapMvcAttributeRoutes(new CoreEntityDirectRouteProvider());
    
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    如果其他人有更“正确”的方法来实现这一点,请分享。

    谢谢。

    史蒂夫

    【讨论】:

      【解决方案2】:

      这就是我在没有 CoreEntityDirectRouteProvider 类并删除 routes.MapRoute(...) 声明的情况下的做法。

      [RoutePrefix("Home")]
      [Route("{action=Index}")]
      public class HomeController : Controller
      {
          [Route("Index")]
          public ActionResult Index()
          {
              return View();
          }
      

      【讨论】:

        猜你喜欢
        • 2016-11-01
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        相关资源
        最近更新 更多