2015-02-01 3 views
2

Я работаю над CMS и должен выполнять динамическую маршрутизацию. Я много пробовал, но решил использовать маршрутизацию, как показано ниже.Есть ли способ передать динамический параметр с атрибутом маршрута?

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

Проблема:

[Маршрут ("{leftPath: значения (объявления | duyurular)}/{announceUrl?}")]

смелая часть динамичный. Например, если я использую только английский язык для пользовательского интерфейса langage, я хочу «анонсы» вместо полужирной части выше. Если я использую английский, турецкий и испанский языки, я хочу «анонсы | duyurular | anuncios».

Если я люблю ниже, я получаю сообщение об ошибке, потому что Атрибуты принимает постоянные строковые переменные:

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

Есть ли способ сделать это или какие-либо предложения.

ответ

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 = новый ValuesConstraint (Tools.GetRouteValues ​​("объявление"))
}

Bolded функция возвращает строку, которую я хочу: 'анонсы' или 'анонсы | 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

Смежные вопросы