2013-10-07 41 views
1

在MVC中,有一個ViewSwitcher,你可以添加_Layout,_Layout.mobile; MyView和可選的MyView.mobile查看Switcher for ServiceStack?

在ServiceStack剃鬚刀視圖中完成此操作的最佳方法是什麼?謝謝

回答

1

ServiceStack不會在運行時隱式地切換佈局,而是需要明確設置首選佈局。 ServiceStack的RazorRockstars Demo website說明如何動態切換的觀點,即:

更改視圖和佈局模板在運行時

上述約定是覆寫投放,您可以更改什麼的視野和佈局模板在運行時由內返回你的反應使用裝飾HttpResult:

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

,每當你想顯示在專門的移動和打印預覽網站模板相同的頁面,這非常有用。您也可以讓哪些查看和模板被用來通過與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"); 
    } 
} 

這個屬性允許改變什麼視圖獲取與查看和模板查詢字符串或FORMDATA請求參數使用的客戶端。該功能的一個活生生的例子是用來改變/搖滾歌星頁:

更改佈局從使用的視圖中

你甚至可以通過在剃刀視圖內設置佈局屬性來更改所使用的佈局,例如:

@inherits ViewPage<Response> 
@{ 
    Layout = IsMobileRequest(base.Request) ? "_LayoutMobile" : "_Layout"; 
} 
+0

感謝您的更新。剛剛開始,到目前爲止,我只有3個項目Web,Service和Modal使用默認的_Layout和Hello.cshtml相互引用。我該如何返回新的HttpResult(dto){}?我是否必須對每個請求/響應都做到這一點?或者它可以在基類上完成?謝謝 – Whoever

+0

@無論您可以使用[全局](https://github.com/ServiceStack/ServiceStack/wiki/Request-and-response-filters)或自定義[Response Filter Attribute](https://github.com/ ServiceStack/ServiceStack/wiki/Filter-attributes),它可以讓你檢查Response DTO並設置'req.Items [「Template」]'在'[ClientCanSwapTemplates]'中完成。否則,要添加*基類的*功能,您可以使用[Custom Service Runner](https://github.com/ServiceStack/ServiceStack/wiki/Customize-HTTP-Responses#using-a-custom-servicerunner) – mythz

+0

謝謝,似乎可能性是無止境的。我現在回到文檔。或者可以試試javascript方法。說到過濾器屬性,我對於同時訪問請求和響應以及在一次往返中批量請求等方面存在一些疑問。我將首先進行一些搜索,並可能在必要時啓動單獨的線程。難以置信的工作!幾乎太好了,不能真實^ _^ – Whoever