2016-07-02 7 views
1

У меня есть этот маршрут:Сделать параметр ASP.NET MVC Id маршрута требуется

routes.MapRoute(
      "PlaceDetails", 
      "{controller}/{action}/{id}", 
      new { controller = "Place", action = "Details", id = UrlParameter.Optional } 
     ); 

Эти маршруты этот штраф: mysite.com/place/details/123

Создание Id 123 доступны для деталей действие контроллера места - которое может затем найти место «123».

Однако - этот URL также передается на контроллер: mysite.com/place/details/

Я хочу, чтобы это вернуть HttpNotFound - но он посылает нулевой Id к контроллеру - и требует от меня обращаться что.

Это кажется более аккуратным, если сам маршрут достигает этого, а не требует неприличных нулевых проверок в самом контроллере.

В этой конкретной проблеме я ничего не нашел в Google.

Как это сделать?

+0

Для справки Я теперь использую только атрибут маршрутизации - путь больше управления, и тем легче получить голову вокруг. – niico

ответ

5

Для того, чтобы значение требуется id, вы не должны установить его в качестве UrlParameter.Optional или указать любое другое значение по умолчанию. Без значения в сегменте URL и по умолчанию маршрут не будет соответствовать запросу.

routes.MapRoute(
    "PlaceDetails", 
    "{controller}/{action}/{id}", 
    new { controller = "Place", action = "Details" } 
); 

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

routes.MapRoute(
    "PlaceDetails", 
    "Place/{action}/{id}", 
    new { controller = "Place", action = "Details" } 
); 

Для получения дополнительной информации и дополнительных параметров см. Why map special routes first before common routes in asp.net mvc?.

2

Удалить необязательный для id заполнителя в дефолтах

routes.MapRoute(
     "PlaceDetails", 
     "{controller}/{action}/{id}", 
     new { controller = "Place", action = "Details"} 
    ); 

Теперь mysite.com/place/details/ не будет соответствовать маршруту. Если вы не указали другой маршрут по умолчанию.

Если выше вызывает конфликты с вашей маршрутизации вы можете изменить его Лик это

routes.MapRoute(
     "PlaceDetails", 
     "Place/Details/{id}", 
     new { controller = "Place", action = "Details"} 
    ); 

, который соединяет это отображение непосредственно PlaceController.Details действие