2012-02-23 23 views
0

我正在寫使用ASP.NET MVC與JSON.NET作爲服務器,發送JSON到由讀取客戶端的應用程序淘汰賽,然後顯示數據綁定。這一切都工作奇妙,除了一個問題:添加ASP.NET MVC路由的網址,查看模型對象(在JSON使用)

我有一個類Customer這是用來生成一個ReviewAuthorViewModel類 - 後者專門用於JSON序列化,並刪除不必要的字段,循環引用等。在客戶端,我想呈現一個鏈接到客戶的個人資料頁面,URL來自定義的MVC路由「user/{username}」。因爲我是通過JSON發送的,所以我沒有.cshtml頁面,我可以在其中撥打Url.Action

現在的問題是:對於一個任意的對象,我怎樣才能最有效地/優雅地獲得一個數據行爲的URL,沒有.cshtml視圖?

我寧願不要求每個動作額外的代碼的解決方案,但可能是除了在JavaScript中重新創建路由表中的客戶端的唯一選擇。以下是我已經嘗試過的事情,以及每個事情都不令人滿意。

解嘗試1

調用UrlHelper.Action方法在ReviewAuthorViewModel類。但是,UrlHelper需要請求上下文。爲了分離問題,我不希望我的視圖模型對System.Web.Routing有依賴性,也不希望它需要請求上下文來運行。

解嘗試2

創建類RouteInformation與成員控制器,動作,和數據,並與兩個屬性的接口IUrlViewModelRouteInformation類型和命名Url一個獲取/設置字符串的一個get。需要鏈接的視圖模型然後實現此界面,並且控制器查找IUrlViewModel類型的視圖模型,並使用來自視圖模型的RouteInformation實例的信息運行UrlHelper.Action,將結果存儲在Url屬性中。

這一個作品但沒有反射我不知道如何找到在其他視圖模型中實現IUrlViewModel視圖模型,它感覺非常kludgy。

回答

0

解嘗試1是行的解決方案。在asp.net-mvc中,視圖模型是表示層的一部分,專門用於視圖。你不應該擔心視圖模型依賴於asp.net特定的東西。事實上,它們應該相互耦合,因爲它們應該被設計成最大限度地簡化Web服務器和Web客戶端之間的視圖生成和數據交換。並且創建單獨的視圖模型並且不直接爲客戶使用Customer類是很好的解決方案。如果Customer取決於Routing,則不會有問題。

事實上,你可以設置該屬性在控制器 -

[HttpGet] 
    public ActionResult Get() 
    { 
     var viewModel = new ReviewAuthorViewModel(); 
     viewModel.ProfilePageUrl = Url.Action("Index", "Profile"); 

     // return viewModel; 
    } 
+0

你有什麼建議有基本上是我做的解決方案2,抽象爲一個接口,使之更容易被重用。但是,這使得很難獲得應該添加URL的嵌套視圖模型對象,並且必須將其添加到每個動作,這似乎是引入難以捉摸的錯誤的好方法。 – ehdv 2012-02-23 17:07:19

+0

我覺得第二個解決方案太複雜,過度設計。 – archil 2012-02-23 17:14:20