Asp.Net MVC Routes - обрабатывать несколько маршрутов с одинаковой подписью? - PullRequest
3 голосов
/ 10 августа 2010

Мне интересно знать, как люди справляются со следующей ситуацией.

Предположим, у нас есть DataField, и у каждого DataField может быть неограниченное количество DataValues ​​

У нас есть 2 контроллера для обработки манипуляциииз этих объектов

  • DataFieldController
  • DataValueContoller

Теперь, если нам когда-либо понадобится добавить новое DataValue, нам нужно знать идентификатор CustomDataField.Будет использоваться следующий URL-адрес:

/CustomDataValue/Add/1 

1 = IDField ID

Однако, поскольку движок ASp.Net MVC связывает имя параметра с моделью (например, IE в приведенном ниже примере. МойОбъекту DatValeu будет заменен его идентификатор, когда я на самом деле пытаюсь пройти через FieldID)

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Site", action = "Home", id = UrlParameter.Optional } // Parameter defaults
    );

Как мы можем справиться с этим?Выполнение следующего, очевидно, не сработает.

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Site", action = "Home", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{fieldid}", // URL with parameters
    new { controller = "Site", action = "Home", fieldid = UrlParameter.Optional } // Parameter defaults
);

Я предполагаю, что это обычная проблема, я просто не могу найти очевидное решение в данный момент.Было бы хорошо, если бы подпись отличалась, но обе являются / String / String / Int

=========================

Как могут работать эти маршруты?

  • / DataValue / Add / {DataFieldID}
  • / DataValue / Edit / {ID}
  • / DataValue / List / {DataFieldID}

Должен ли я добавить 3 маршрута?

1 Ответ

5 голосов
/ 10 августа 2010

Используйте ограничения на маршрутах, подобных этому:

routes.MapRoute(
    "Default", // Route name
    "CustomDataValue/{action}/{fieldid}", // URL with parameters
    new { controller = "Site", action = "Home", fieldid = UrlParameter.Optional } // Parameter defaults
);

Это гарантирует, что только URL, начинающиеся с «CustomDataValue», вызывают этот маршрут. Он объявлен как константа, отличная от маршрута по умолчанию. Убедитесь, что указанные маршруты объявлены перед маршрутом по умолчанию. Поскольку ограничений нет, все URL-адреса сопоставляются с ним.

Обновление

Полагаю, вам нужно вызывать методы DataValueController с URL-адресами, такими как http://domain.com/CustomDataValue/Add/23. В этом случае используйте следующий маршрут:

routes.MapRoute(
    "CustomData", // Route name
    "CustomDataValue/{action}/{fieldid}", // URL with parameters
    new { controller = "DataValue", action = "List", fieldid = UrlParameter.Optional } // Parameter defaults
);

Это будет работать, если у вас есть методы действия в DataValueController с именем List / Add / Edit.

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