2016-02-10 2 views
0

У меня есть следующий сценарий:Url.Action поставляет неправильный результат, когда RouteAttribute используется

[RoutePrefix("MvcApi/MyData")] 
public class MyDataController : Controller 
{ 
    [Route("GetAsSelectionListBySiteId/{siteId}")] 
    public async Task<ActionResult> GetAsSelectionListBySiteId(int siteId) 
    { 
     var items = await IoC.Instance.GetInstance<IDataProvider>().GetBySiteIdAsync(ParallelDataAccessor, siteId); 
     return Json(items.Select(s => new KeyValuePair<int, string>(s.Identifier, s.DisplayName)).ToArray(), JsonRequestBehavior.AllowGet); 
    } 

    public static class Routes 
    { 
     public static RouteValueDictionary GetAsSelectionListBySiteId(int siteId) 
     { 
      return new RouteValueDictionary() 
       .AddReturn(nameof(siteId), siteId) 
       .AddReturn("area", "MvcApi"); 
     } 
    } 
} 

Когда я использую

@Url.Action("GetAsSelectionListBySiteId", "MyData", MyDataController.Routes.GetAsSelectionListBySiteId(5))

в представлении это будет отображаться как

MvcApi/MyData/GetAsSelectionListBySiteId?siteId=5 <- 404 error

, когда я действительно нуждаюсь в нем, как является

MvcApi/MyData/GetAsSelectionListBySiteId/5 <- 200 ok

Является ли это ошибка в @ Url.Action? Есть ли способ повлиять на него?

ответ

1

При создании URL-адресов ваши лучшие параметры - это всегда использовать имена маршрутов, потому что таким образом вы не попадаете в тонкости алгоритма, используемого для выбора маршрута, который будет использоваться для создания URL-адреса.

Мой совет, если вы не используете Url.Action и вместо этого используете Url.RouteUrl, который позволяет указать имя маршрута, которое должно использоваться для создания URL-адреса.

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

+0

http://stackoverflow.com/questions/26365464/url-action-map-a-wrong-link-from-route-attribute – Dbl

+0

Однако Resharper не предлагает поддержку Routejumps. Так что мне это не нравится, потому что рефакторинг/коразвивание будет хуже – Dbl