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

时间:2015-02-01 14:51:18

标签: asp.net-mvc url asp.net-mvc-routing

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

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

问题:

  

〔路线( “{leftPath:值(的公告| duyurular )} / {?announceUrl}”)]

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

如果我喜欢下面的内容,我会收到错误,因为Attributes接受常量字符串变量:

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

有没有办法做到这一点或任何建议。

1 个答案:

答案 0 :(得分:0)

我对此感到抱歉,但我找到了解决方案,我没有尝试足够的解决方案。 这段代码解决了我的问题。 (在RouteConfig类中 - > 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")) }
);
  

约束:新{
  leftPath = new ValuesConstraint( Tools.GetRouteValues("公告")
  }

粗体函数返回我想要的字符串:' 公告'或者' 公告| 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