Пользовательская (атрибутная) маршрутизация MVC с необязательным параметром не работает

Мой контроллер выглядит так:

[HttpGet]
[Route("{brand}/{category}/{subcategory?}/{productid:int:min(9000)}", Name="ProductDetails")]
public ActionResult Details(int productid)
{ //...}

Я также пробовал без вопросительного знака в конце подкатегории, потому что он может быть нулевым.

[Route("{brand}/{category}/{subcategory}/{productid:int:min(9000)}", Name="ProductDetails")]

У меня есть это в моих представлениях бритвы:

 <a href="@Url.RouteUrl("ProductDetails", 
      new { brand = item.Brand, 
            category = item.CatCodeNaam, 
            subcategory = item.SubCategoryName, 
            productid = item.ID })">test</a>
 <a href="@Url.Action("Details", "Products", 
      new { brand = item.Brand, 
            category = item.CatCodeNaam, 
            subcategory = item.SubCategoryName, 
            productid = item.ID })">test</a>

Оба метода отлично работают, когда SubCategoryName не пусто. Но что делать, когда он пуст? Я не могу добавить другой маршрут, потому что он будет иметь такое же количество (и тип) входных параметров, только один int.

Когда у меня есть этот контроллер:

[HttpGet]
[Route("{brand}/{category}/{subcategory}/{productid:int:min(9000)}", Name = "ProductDetails")]
[Route("{brand}/{category}/{productid:int:min(9000)}", Name = "ProductDetails2")]
public ActionResult Details(int productid)

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


person JP Hellemons    schedule 27.05.2015    source источник


Ответы (1)


«Исправил» это с помощью этой компактной строки в моей бритве:

<a href="@(!string.IsNullOrWhiteSpace(item.SubCategoryName) ? Url.RouteUrl("ProductDetails", new { brand = item.Brand, category = item.CatCodeNaam, subcategory = item.SubCategoryName, productid = item.ID }) : Url.Action("Details", "Products", new { brand = item.Brand, category = item.CatCodeNaam, subcategory = item.SubCategoryName, productid = item.ID }))">

благодаря https://stackoverflow.com/a/4092187/169714

Тем не менее, я все еще жду лучшего решения, поэтому я не приму свой ответ и надеюсь, что есть лучшее решение.

person JP Hellemons    schedule 27.05.2015