2010-08-03 64 views
0

我想有所謂的「產品」,在那裏我可以使用途徑,如MVC領域和路由

http://localhost/products/foo

http://localhost/products/bar

我想有一個區域視圖和其他資產組織成文件夾結構,如

/areas/products/views/foo/index.aspx 
/areas/products/views/bar/index.aspx 

我想在各自的/ area/products/views /(foo | bar)/文件夾中保留與每個產品(foo,bar)特別相關的圖像等。

我也不想爲每個產品添加控制器操作。

如果我宣佈樣

context.MapRoute(
    "products-show-product" 
    , "Products/{id}" 
    , new { controller = "Products", action = "Index", id=UrlParameter.Optional } 
    ); 

一個途徑,並請求URL

http://localhost/products/foo

然後ProductsController.Index()被調用,如我期望的那樣。但是,由於「foo」視圖不在視圖/產品或視圖/共享文件夾中,因此未找到該視圖。

我該如何做到這一點,以便我可以將每個產品的頁面保存在一個單獨的文件夾中?

回答

1

我對你的問題沒有具體的答案,因爲我不確定我對它的理解。不過,我對解決方案的方向有一般感覺。

當開始更改視圖的位置時,找到這些視圖的相應方法也需要更改。一個簡單的方法是覆蓋FindViewFindPartialView方法。

一個簡單的演示。我創建了一個名爲Blog的區域,一個帶有Index方法的Blog控制器。在我的情況下,我使用控制器操作作爲子文件夾,但我相信這可以擴展到每個產品文件夾的情況。我認爲該產品將是一個請求參數。 Area http://www.freeimagehosting.net/uploads/85b5306402.gif

其基本思想是詢問控制器,區域,操作和id的controllercontext並修改默認viewengine尋找的內容。區域視圖的默認位置看起來像"~/Areas/{2}/Views/{1}/{0}.aspx",所以我們可以基本上爲視圖名稱注入值,在這種情況下爲ActionName/Index。視圖位置將最終爲~/Area/Blog/Views/Blog/Index/Index.aspx

這只是可以使用的代碼的粗略概述。字符串比較絕對可以更新爲更健壯的方法。按照預期,此方法將適用於整個應用程序,除了索引操作對Blog區域發出請求的情況外。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     if (controllerContext.RouteData.DataTokens ["Area"] == "Blog") 
     { 
      if (String.Compare(controllerContext.RouteData.Values ["Action"].ToString(),"Index",true) == 0) 
      { 
       var viewLocation = String.Format("{0}/{1}", controllerContext.RouteData.Values["Action"].ToString(), viewName); 
       return base.FindView(controllerContext, viewLocation , masterName, useCache); 
      } 
     } 
      return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 
+0

感謝您的詳細解答。在這種情況下,我只需要一個控制器,所以我只需添加一條將所有內容都發送到Index操作的路由,從而根據路由參數構建視圖路徑。 – 2010-08-04 15:39:27

+0

很高興您設法解決您的問題... – Ahmad 2010-08-04 16:22:50