ServiceStack Controllerless Razor Views - Возвратный просмотр без выполнения сервиса
Прямо сейчас у нас есть много фиктивных контроллеров MVC, которые возвращают простые представления с веб-компонентами (vuejs). Я пытаюсь реорганизовать это, чтобы увидеть, можем ли мы использовать плагин без контроллера, но я не хочу выполнять реальную служебную логику, когда маршрут запрашивается браузером, потому что компонент уже делает это. Пример:
/account/edit/1
стандартный контроллер MVC -> связан с представлением, которое имеет что-то вроде этого <account edit="1" />
это делает вызов AJAX /api/account/get/1
, Я хочу добавить движок Service Stack Razor, чтобы мы могли просто использовать:
/api/account/get/1
(мы удалили бы часть API или добавили альтернативный маршрут), и это не выполняло бы логику, но выполнило бы атрибуты безопасности, чтобы мы могли удалить стандартные контроллеры MVC, которые не используются. Я знаю, что мы можем добавить разные сервисы для этого, чтобы заставить его работать, но я бы предпочел использовать одну и ту же конечную точку и просто не выполнять ее, а возвращать бритву.
Есть идеи?
Не тот ответ, который я хотел бы услышать, но по сути мы не можем делать то, что хотим, вместо этого мы создадим несколько фиктивных служб стека служб, которые будут возвращать правильные представления, которые по-прежнему исключают контроллеры.
1 ответ
Чтобы использовать опцию No Ceremony в ServiceStack.Razor, где вы можете возвращать динамические Razor Views без использования ServiceStack Service, ваш маршрут должен совпадать со страницей бритвы, чтобы у вас не было такого маршрута, как:
/account/get/1
Так как для этого потребуется страница Razor Content по адресу:
/account/get/1.cshtml
Вместо этого вы можете добавить его в queryString как /account/get?id=1
как тогда вы можете иметь страницу содержимого Razor, как:
/account/get?id=1
Если бы вы хотели справиться /account/get/1
вам понадобится служба, которая обрабатывает этот маршрут, например:
[Route("/account/get/{Id}", "GET")]
class ViewAccount
{
public int Id { get; set; }
}
Ваша служба может просто вернуть тот же запрос DTO, например:
public object Get(ViewAccount request) => request;
Как будет принято, можно обрабатывать Razor View, расположенный по адресу:
/Views/ViewAccount.cshtml
С моделью:
@model ViewAccount
Примечание: как правило, не рекомендуется иметь /get
в маршрутах это обычно дифференцируется запросом HTTP GET, поэтому я бы порекомендовал либо удалить get
и просто имея:
[Route("/account/{Id}", "GET")]
Или, если вы хотите использовать отдельный маршрут для представлений Razor, используйте нечто иное, чем HTTP-глагол, что может сбивать с толку, представление IMO больше подходит для HTML-страниц, например:
[Route("/account/view/{Id}", "GET")]