Учитывая определение маршрута как это:
routes.MapHttpRoute(
name: "Categories",
routeTemplate: "{controller}/Categories/{entity}/{property}",
defaults: new { action = "Categories", entity = RouteParameter.Optional, property = "Name" }
);
И действия контроллера объявлены так:
public IEnumerable<Category> Categories(string property);
public IEnumerable<Category> Categories(string entity, string property);
Цель заключается в том, чтобы контроллер представлял конкретную сущность и мог объединять другие сущности. Возвращенные категории содержат сгруппированные и количество свойств. Поэтому, если контроллером является UserController, а пользовательский объект имеет свойство Name, вы можете вызвать User/Categories/Name
и получить результат, показывающий разные имена и сколько из них имеют каждое имя.
Если, однако, у Пользователя также есть объект Address, и у него есть ZipCode, я мог бы позвонить User/Categories/Address/ZipCode
и ожидать результата, показывающего, сколько пользователей живут с какими ZipCodes.
Проблема здесь в том, что параметр string entity
имеет тип string
, а не тип Type
, поэтому я должен испачкать действие с помощью кода, чтобы преобразовать его в экземпляр Type, представляющий сущность, и бросить, если это неверная строка.
Я хотел бы вместо этого объявить мое второе действие следующим образом:
public IEnumerable<Category> Categories(Type entity, string property);
Но тогда мне нужно десериализовать строку с помощью специального десериализатора. У меня уже есть собственные десериализаторы ака MediaTypeFormatters
для вещей, поступающих из тела контента. Моя проблема здесь в том, что в этом случае источником является параметр URI, а не тело контента.
Что приводит к моим вопросам:
- Будет ли MediaTypeFormatter также работать для параметров URI?
- Если нет, какую конструкцию я должен реализовать и подключить, как достичь того, чего я хочу?