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")]
Другие вопросы по тегам