0

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

例子:

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

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

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

谢谢

史蒂夫

4

2 回答 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 }
        );
    }
}

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

谢谢你。

史蒂夫

于 2014-08-16T18:26:42.040 回答
0

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

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    {
        return View();
    }
于 2014-08-18T13:06:00.220 回答