有没有办法通过路由属性传递动态参数?

Is there any way to pass dynamic parameter with route attribute?

我正在使用 CMS,需要进行动态路由。我尝试了很多东西,但我决定使用如下所示的路由。

[Route("{leftPath:values(announcements|duyurular)}/{announceUrl?}")]
public ActionResult Announcements(string leftPath, string announceUrl)
{
    ViewBag.Url = announceUrl;
    return View();
}

问题:

[Route("{leftPath:values(announcements|duyurular)}/{announceUrl?}")]

粗体部分是动态的。例如,如果我只使用英语作为用户界面语言,我想使用“announcements”而不是上面的粗体部分。如果我使用英语、土耳其语和西班牙语,我想 'announcements|duyurular|anuncios'.

如果我这样做,我会收到错误消息,因为属性接受常量字符串变量:

[Route("{leftPath:values(" + GetRouteValues() + ")}/{announceUrl?}")]
public ActionResult Announcements(string leftPath, string announceUrl)
{
    ViewBag.Url = announceUrl;
    return View();
}

有没有办法做到这一点或有什么建议。

我对此感到抱歉,但我找到了我的解决方案,我没有尝试足够的解决方案。 这段代码解决了我的问题。 (在 RouteConfig class -> RegisterRoutes() 函数中。):

routes.MapRoute(
    name: "announcementRoute",
    url: "{leftPath}/{announcementUrl}",
    defaults: new { controller = "Home", action = "Announces", announcementUrl = UrlParameter.Optional },
    constraints: new { leftPath = new ValuesConstraint(Tools.GetRouteValues("announcements")) }
);

constraints: new {
leftPath = new ValuesConstraint (Tools.GetRouteValues ( "announcements" ))
}

粗体函数 returns 字符串我想要什么:'announcements' 或 'announcements|duyurular|anuncios' 基于语言。

好奇者:

public class ValuesConstraint : IRouteConstraint
{
    private readonly string[] validOptions;
    public ValuesConstraint(string options)
    {
        validOptions = options.Split('|');
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        object value;
        if (values.TryGetValue(parameterName, out value) && value != null)
        {
            return validOptions.Contains(value.ToString(), StringComparer.OrdinalIgnoreCase);
        }
        return false;
    }
}

更多:MSDN Resource