2017-06-02 55 views
1

現在我們有很多虛擬MVC控制器可以使用Web組件(vuejs)返回簡單的視圖。我試圖重構這個,看看我們是否可以使用無控制器的razor插件,但我不想在瀏覽器請求路由時執行實際的服務邏輯,因爲組件已經這樣做了。一個例子:ServiceStack無控制器Razor視圖 - 不執行服務的返回視圖

/account/edit/1是一個標準的MVC控制器 - >被關聯到具有這樣的事情<account edit="1" />,使一個AJAX調用/api/account/get/1的圖。我想添加服務堆棧Razor引擎,以便我們可以使用:

/api/account/get/1(我們將刪除api部分或添加替代路由),這不會執行邏輯,但會執行安全屬性,所以我們可以刪除不使用的標準MVC控制器。我知道我們可以爲此添加不同的服務,但我寧願使用相同的端點,只是不執行它,但返回剃鬚刀。

任何想法?

不是我想聽到的答案,但基本上我們不能做我們想做的事情,相反我們會創建一些虛擬服務堆棧服務來返回仍然消除控制器的正確視圖。

回答

2

爲了使用ServiceStack.Razor's No Ceremony Option在那裏你可以返回動態剃刀意見而無需ServiceStack服務你的路線需要匹配剃刀網頁,讓你不會有這樣的路線:

/account/get/1 

作爲該需要在剃刀內容頁:

/account/get/1.cshtml 

你可以它,而不是添加到像/account/get?id=1查詢字符串的,那麼你可以有一個剃刀內容頁面,如:

/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; 

這將是約定能夠處理剃刀視圖位於:

/Views/ViewAccount.cshtml 

隨着模型:

@model ViewAccount 

注:它一般不建議在路線/get,這通常是通過HTTP GET請求分化所以我建議,要麼去除get,只是有:

[Route("/account/{Id}", "GET")] 

或者,如果你想爲剃刀意見的獨立路徑使用比一個HTTP動詞其他一些東西,可能會造成混淆,IMO 觀點更適合HTML PAG es,e。g:

[Route("/account/view/{Id}", "GET")] 
+0

我不確定這是否回答我的問題。我只是用作爲一個例子。假設路由已設置,並指向獲取該ID帳戶的正確服務。在生成剃鬚刀之前,服務的邏輯是否會被調用?這正是我想要避免的,因爲我們所有的視圖都有像微型spa應用程序這樣的組件,它們會自行調用以獲取數據。 – lucuma

+0

@lucuma如果他們指向一個服務,它總是在視圖前執行。 Razor視圖是服務響應的[HTML內容類型表示](http://docs.servicestack.net/architecture-overview),但No Ceremony選項允許您繞過需要服務並直接執行Razor頁面因爲頁面與路線相匹配。還要確保你知道[內容頁vs查看頁面](https://stackoverflow.com/a/13206221/85785) – mythz

+0

@lucuma之間的區別如果你正在構建SPA,你通常不需要HTML視圖,只需要想要通過Ajax訪問JSON響應,如果您使用JSON客戶端,ServiceStack將自動返回服務的JSON響應。 – mythz