Сделать параметр идентификатора маршрута ASP.NET MVC обязательным

У меня есть этот маршрут:

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

Это нормально: mysite.com/place/details/123

Предоставление идентификатора 123 для действия деталей контроллера места, который затем может найти место «123».

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

Я хочу, чтобы это возвращало HttpNotFound, но оно отправляет контроллеру нулевой идентификатор и требует, чтобы я обработал это.

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

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

Как я могу это сделать?


person niico    schedule 02.07.2016    source источник
comment
Для справки, теперь я использую маршрутизацию только по атрибутам — гораздо больше контроля, намного проще разобраться.   -  person niico    schedule 13.05.2017


Ответы (2)


Чтобы сделать значение 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" }
);

Подробности и дополнительные параметры см. в разделе Зачем сопоставлять специальные маршруты перед общими маршрутами в asp.net mvc?.

person NightOwl888    schedule 02.07.2016

Удалите необязательный параметр для заполнителя 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

person Nkosi    schedule 02.07.2016