有没有办法通过路由属性传递动态参数?
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;
}
}
我正在使用 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;
}
}