ASP.NET MVC Routing help - PullRequest
       4

ASP.NET MVC Routing help

0 голосов
/ 18 апреля 2011

Я пытаюсь создать маршрут, который может разрешать различные форматы (html / json / xml и т. Д.)

Это то, что я пытаюсь, но это не работает.

routes.MapRoute(
          "Default",
          "{controller}/{action}/{id}/{format}",
          new { controller = "Home", action = "Index", id = UrlParameter.Optional, format = "html" },
          new { format = @"html|json" , id=@"\d+"}
       );

Работающие маршруты: / Person / подробности / 1 / Человек / подробности / 1 / * 1006 JSON *

Но это не работает: / Person, которому по умолчанию imo следует / Person / Index / html / Персона / JSON и IMO должны привести к / Персона / Индекс / JSON

Но это не соответствует.

Для второго из тех, кто не работает, я предполагаю, что он думает, что json - это действие, и в этом проблема. Но для первого я не получаю его полностью, так как у меня есть значения по умолчанию для каждой части URL , и id необязателен, и он не может думать, что html / json является идентификатором, поскольку я говорю, что id должен быть числом в любом случае, поэтому он должен получить его.

Так кто же не первый, кто работает?

Для второго я намеревался написать регулярное выражение, подобное этому (я знаю, что это не настоящее регулярное выражение, кстати, любая помощь по этому вопросу также приветствуется ..): action = @ "! (Html ​​| json | \ d + ) ", чтобы он увидел, что я не пытаюсь сказать, что json / html - это действие, но что тогда он должен использовать индексное действие по умолчанию.

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

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

проблема

Маршруты могут иметь несколько необязательных параметров (хотя я советую вам не использовать их, если вы не очень хорошо знаете маршрутизацию Asp.net MVC), но вы не можете иметь необязательные параметры после необязательных, поскольку вы это сделали ...

Представьте себе, что произойдет, если вы установите нестандартное значение "json" для своего формата, но не предоставите id? Что придет на место id? Вы столкнулись с очень похожей проблемой с несколькими дополнительными устройствами, поэтому я советую вам не использовать их.

Два решения

  1. Изменить порядок параметров:

    "{controller}/{action}/{format}/{id}"
    
  2. Использовать два маршрута

    routes.MapRoute(
        "Ordering",
        "{controller}/{action}/{format}",
        new { controller = "Home", action = "Index", format = "html" },
        new { format = @"html|json|xml"}
    );
    
    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}/{format}",
        new { controller = "Home", action = "Index", format = "html" },
        new { format = @"html|json|xml", id = @"\d+"}
    );
    

    Первый будет охватывать запросы, в которых ID является необязательным, и вы предоставляете формат, а второй - ситуации, когда ID присутствует.

0 голосов
/ 18 апреля 2011

Параметр id не может быть необязательным. Только последний параметр определения маршрута может быть необязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...