2011-10-04 69 views
2

簡而言之,我想簡化一些MVC頁面,方法是創建一個靜態類以從某種數據存儲中獲取數據,然後返回多個基於一些內部標誌的視圖。MVC3:從非控制器類返回視圖對象

internal static class StaticPageContent 
{ 
    internal static ViewModels.Display GetPage(string Map = null, int? ID = null) {...} 
    internal static ActionResult ReturnView(ViewModels.CMS.Display vm) {...} 
} 

然後,在我的任何控制器動作我可以叫它是這樣的:

public ActionResult ActionName() 
{ 
    var vm = StaticPageContent.GetPage("/Home"); 
    return StaticPageContent.ReturnView(vm); 
} 

凡ReturnView()方法將返回多個(共享)的觀點之一:

internal static ActionResult ReturnView(ViewModels.CMS.Display vm) 
{ 
    if (vm.useLoremIpsum) 
     return View("LoremIpsum", vm); 
    else 
    { 
     if (vm.canEdit) 
      return View("ViewReadWrite", vm); 
     else 
      return View("ViewReadOnly", vm); 
    } 
} 

從非控制器類返回View(...)對象的正確方法是什麼?由於View(...)是Controller類的一部分,因此以上不會編譯。


注: 我相信我有這樣的工作,但給我發在另一個方向上我當時的需求了。我希望能夠打開這個項目,看看我做了什麼,並在這裏發佈。敬請關注!

+0

我已經創建,希望能爲你指明正確的方向的東西:http://stackoverflow.com/questions/3808076/using-the-razor-view-engine-in- a-different-way/3815216#3815216 – Buildstarted

回答

1

簡而言之,正確的方法是不是在靜態類中。 (當然,國際海事組織)。特別是如果您從數據存儲獲取「數據」 - 這不應該是靜態的。

IMO,在基本控制器中創建一個受保護的方法,或使用子操作並使用Html.Action將其渲染出來。

+0

自從我訪問這個問題已經有一段時間了。只是一個好奇的問題 - 你認爲靜態類在這種情況下是不好的?我明白這是一個單身人士,可能會成爲瓶頸。除此之外的任何事情?我的意圖是基本上使用數據源中的數據填充編輯器或只讀頁面。整個網站的視圖定義將是相同的(跨越各種路線)。我只是在尋找一種簡單的方法來編寫一個可在整個網站上使用的單一通用視圖。 :) –

+0

@KeithBarrows - 是的,單身是一個原因。另一個是鬆散耦合 - 靜態類不能在接口後面實現,因此不能輕易換出或單元測試。 – RPM1984

+0

我創建了一個基礎控制器。 「靜態視圖」基本上是一個填充,直到我開始爲該頁面編寫真正的數據綁定魔術。換句話說,我可以創建一個包含大量「Ipsum Lorem」頁面的網站,然後開始構建每個頁面的邏輯,以便我的客戶可以看到正在取得的進展,並且仍然能夠感受到最終網站帶有假人數據。 –