2010-10-30 68 views
1

我有一個MVC應用程序與自定義視圖引擎實現主題選擇,即視圖的母版頁的動態設置。應用程序結構描述爲 here 問題是主頁面在Views文件夾中的默認位置不存在。 (這是因爲我想要所有主題相關的文件,即.css和圖像與master一起放在一個地方。將css放入Views將會破壞安全問題 - 默認視圖web.config不允許訪問任何內容,我寧願保持這種方式),一切工作正常,直到我試圖改變母版頁是強類型,即指定ASP.NET MVC強類型母版頁視圖文件夾

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MyApp.Models.BaseModel>" %> 

然後在頁面拋出錯誤:

Could not load System.Web.Mvc.ViewMasterPage < MyApp.Models.BaseModel >

那麼,有什麼辦法可以將該名稱空間導入它所需的位置嗎?要改變web.config(在視圖文件夾,我假設)或其他地方的一些設置?

回答

0

您始終可以將信息作爲ViewData傳遞並將其重新轉換爲強類型。或者你可以創建一個ViewDataFacade類,這樣就可以在類中自己處理。

更新:

控制器(或控制器基地類似的東西):

public class MyController 
{ 
    public ActionResult Index() 
    { 
    ViewData["MyComplexType"] = GetMyComplexType(); 

    return View(); 
    } 
} 

的ViewDataFacade類將是這樣:

public class ViewDataFacade 
{ 
    public MyClass MyComplexType { get; set; } 

    public ViewDataFacade(ViewDataDictionary viewData) 
    { 
    //If it exists, cast the viewdata object as MyComplexType, or return a new instance. 
    this.MyComplexType = viewData["MyComplexType"] != null ? (MyClass)viewData["MyComplexType"] : new MyClass(); 
    } 
} 

視圖:

<%-- Constructor for the ViewDataFacade takes the current ViewData --%> 
<% ViewDataFacade viewData = new ViewDataFacade(ViewData); %> 

<%-- Example of MyComplexType that is a collection, with a single item (MyProperty) --%> 
<ul> 
    <% foreach(var item in viewData.MyComplexType) { %> 
    <li><%= item.MyProperty %></li> 
    <% } %> 
</ul> 
+0

爲什麼我需要強類型的主要原因是基礎模型有一些方法將在整個主站的許多地方使用。我知道我可以用類型化ViewData.Model,但想象一個充滿了類型轉換的頁面 - 不完全是一個很好的代碼。到目前爲止,我只是簡單地使用對象的擴展方法,所以它在無類型的主模塊上「模擬」了BaseModel的方法。但這只是暫時的解決辦法,我希望。只是認爲應該有一些簡單的方法來做到這一點(如在.config中添加單行)。也許不會。至於ViewDataFacade - 我不確定我是否理解你的意思,如果你能詳細說明......? – tom 2010-11-14 18:05:28

+0

嗨,湯姆,我已經用一個例子更新了答案。謝謝。 – 2010-11-14 21:04:02

0

這是一個猜測......但是當你嘗試在您的視圖代碼中使用的命名空間你沿着這些線路的錯誤(例如,對於HTML Helper),視圖引擎無法引用,您可以通過將其添加到部分的web.config中來解決此問題。

所以也許這會解決它?

<add namespace="MyApp.Models"/>