Посмотреть Switcher для ServiceStack?

В MVC есть ViewSwitcher, и вы можете добавить _Layout, _Layout.mobile; MyView и дополнительный MyView.mobile

Каков наилучший способ сделать это в представлении бритвы ServiceStack? Спасибо

1 ответ

Решение

ServiceStack неявно переключает макеты во время выполнения, вместо этого необходимо явно установить предпочтительный макет. Демо-сайт RazorRockstars от ServiceStack объясняет, как динамически переключать представления, а именно:

Изменение видов и шаблонов макетов во время выполнения

Вышеупомянутое соглашение может быть переопределено, когда вы можете изменить как View, так и Layout Template, используемые во время выполнения, возвращая ваш Response внутри декорированного HttpResult:

return new HttpResult(dto) {
    View = {viewName},
    Template = {layoutName},
};

Это полезно, когда вы хотите отобразить одну и ту же страницу в специализированных шаблонах веб-сайтов Mobile и Print Preview. Вы также можете позволить клиенту изменить используемые View и Template, приписав вашу службу атрибуту фильтра запроса ClientCanSwapTemplates:

[ClientCanSwapTemplates]
public class RockstarsService : RestServiceBase { ... }

Сама по себе очень простая реализация, которая также показывает, что вы можете поменять представление или шаблон, используемые внутри фильтра запросов:

public class ClientCanSwapTemplatesAttribute : RequestFilterAttribute
{
    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        req.Items["View"] = req.GetParam("View");
        req.Items["Template"] = req.GetParam("Template");
    }
}

Этот атрибут позволяет клиенту изменять, какое представление используется с параметрами запроса и шаблона QueryString или FormData. Пример использования этой функции в реальном времени используется для изменения страницы / rockstars:

Изменение макета, используемого из вида

Вы даже можете изменить используемый макет, установив свойство Layout из Razor View, например:

@inherits ViewPage<Response>
@{
    Layout = IsMobileRequest(base.Request) ? "_LayoutMobile" : "_Layout";
}
Другие вопросы по тегам