2014-09-08 2 views
3

У меня небольшая проблема с ASP.NET и MVC5 (я начинаю с MVC.NET). До вчерашнего дня все отлично работало! Но сегодня я не знаю, почему, у меня проблемы с «Аннотации пользовательских маршрутов».ASP.NET MVC5 Маршрут Аннотации MS_DirectRouteMatches

У меня есть Controler "Prodouits" с этим действий:

[Route("{culture}/Produits/{nom_groupe}/{nom}-{id}")] 
public ActionResult Detail(string nom_groupe, string nom, string id) 
{ 
    // ... 
    return View(); 
} 

В моих взглядов, когда я называю "Url.Action (...)", то URL хорошо. Но когда я перехожу на страницу, RouteData кажется плохим (RouteData не восстанавливается правильно).

Посмотрите на мои RouteData: клавиши [0] => "MS_DirectRouteMatches" клавиши [1] => "контроллер"

Values[0] => //A list of only 1 RouteData with my 6 parameters into it... 
Values[1] => Produits 

Если удалить мой "Custom Route Annontation", все работает замечательно, но URL-адрес очень печален ...

Есть ли у кого-нибудь идеи о проблеме и решении? Спасибо всем за помощь!

EDIT: Дополнительная информация о проблеме. У меня есть «BaseController» для языка. Я переопределяю метод BeginExecuteCore. Существует код:

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 
    string cultureName = RouteData.Values["culture"] as string; 

    // Attempt to read the culture cookie from Request 
    if (cultureName == null) 
     cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages 

    // Validate culture name 
    cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe 


    if (RouteData.Values["culture"] as string != cultureName) 
    { 

     // Force a valid culture in the URL 
     RouteData.Values["culture"] = cultureName.ToLowerInvariant(); // lower case too 

     // Redirect user 
     Response.RedirectToRoute(RouteData.Values); 
    } 


    // Modify current thread's cultures    
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); 
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

    return base.BeginExecuteCore(callback, state); 
} 

Спасибо за помощь :-)

EDIT: Никто не имеет решения? Еще раз спасибо!

+0

Является ли ваш '' RouteData' в RouteCollectionRoute'? Если это так, то этот вопрос может быть полезен: http://stackoverflow.com/q/22416561 –

ответ

1

Вы хотите, чтобы переменная сегмента {culture} была определена при рендеринге ссылки на странице. Я подозреваю, что причиной отказа вызова ссылки на действие может быть отказ

Система маршрутизации MVC при генерации URL исходящего маршрута всегда гарантирует, что она может установить значение для каждой требуемой переменной сегмента в URL маршрута для маршрута быть спичкой. Если вы не можете всегда гарантировать это, один из способов может быть редизайн связь со значением по умолчанию для переменной в {culture} сегмента примерно так:

[Route("{culture=en-us}/Produits/{nom_groupe}/{nom}-{id}")]

Другой вариант вы можете попробовать, чтобы определить 2 маршрута на одном действии метод, как так:

 [Route("{culture}/Produits/{nom_groupe}/{nom}-{id}")] 
     [Route("Produits/{nom_groupe}/{nom}-{id}")] 
     public ActionResult Detail(string nom_groupe, string nom, string id, string culture = null) 
     { 
      if(string.IsNullOrWhitespace(culture)) { 
       culture = //Resolve a value for culture here 
      } 
      // ... 
      return View(); 
     } 

таким образом, вы получаете лучшее из обоих миров, где, если вы не можете обеспечить значение для переменной в {culture} сегмента, то он будет соответствовать против второго отображения маршрута атрибут, и вы можете просто решить значение в методе действия.

5

Для маршрутизации атрибутов значения маршрута хранятся в файле вложенным ключом маршрута с именем «MS_DirectRouteMatches» (как вы уже узнали сами).

Вот как сделать RouteData работу, как ожидается, при работе с Attribute маршрутизации:

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 
    // DEMO: now cultureNameTest will be null 
    string cultureNameTest = RouteData.Values["culture"] as string; 

    var routeData = RouteData; 
    if (routeData.Values.ContainsKey("MS_DirectRouteMatches")) 
    { 
     routeData = ((IEnumerable<System.Web.Routing.RouteData>)RouteData.Values["MS_DirectRouteMatches"]).First(); 
    } 

    // Now cultureName will not be null 
    cultureName = routeData.Values["culture"] as string; 

Я нашел это решение здесь: https://stackoverflow.com/a/29083492/533460

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