2014-06-14 47 views
1

Views文件夾中的資源是CSS,在View中使用的圖像,現在我知道它不同於它的意思,我們已經把所有東西放在Contents文件夾中,但我正在尋找更好的方式來管理它。如何訪問ASP.NET視圖文件夾中的資源?

我們有一個非常大的MVC 4,有很多地區,每個地區都有很多意見。爲了維護一切,我們在內容文件夾中創建了類似的文件夾結構,以相應地分發CSS和圖像

但問題是,引用每個資源的視圖。跟蹤變得困難,這裏是文件夾結構。

    • 應用
      • 控制器
      • 查看
        • 項目
          • Search.cshtml
        • 用戶
          • Account.cshtml
  • 內容
    • common.less
    • 應用
      • app.less
      • 一些,但ton.png
      • projects.less
      • users.less當我們有太多的資源和交叉引用是困難的,因爲我們做用戶界面更改現在

出現問題,新隨着項目的發展,視圖會出現。

我想有資源爲以下格式,

    • 應用
      • 控制器
      • 查看
        • 項目
          • Search.cshtml
          • search.less
          • 一些按鈕。PNG
        • 用戶
          • Account.cshtml
          • account.less
          • 一些-button.png

我該怎麼辦?

我的每一個控制器都來自一個普通的AppController,我們在其中驗證用戶身份驗證和角色。我已經實現了CustomActionInvoker來查找如下的視圖。

private string defaultViewName = ""; 

protected virtual object GetDefaultViewModel() { 
    return null; 
} 

public virtual ActionResult DefaultView() { 

    try 
    { 
     var view = this.View(defaultViewName); 
     if (view == null) 
     { 
      return HttpNotFound(defaultViewName + " View not found"); 
     } 
     ViewBag.Title = defaultViewName; 
    } 
    catch 
    { 
     //Utils.Log(ex); 
     //throw; 
     return HttpNotFound(defaultViewName + " View not found"); 
    }    

    return View(defaultViewName, GetDefaultViewModel()); 
} 

protected override IActionInvoker CreateActionInvoker() 
{ 
    return new DefaultViewInvoker(base.CreateActionInvoker(), this); 
} 

internal class DefaultViewInvoker : ControllerActionInvoker { 

    private IActionInvoker parent; 
    private CastingWebController wc; 

    internal DefaultViewInvoker(IActionInvoker parent, CastingWebController wc) 
    { 
     this.parent = parent; 
     this.wc = wc; 
    } 

    protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName) 
    { 
     ActionDescriptor ad = base.FindAction(controllerContext, controllerDescriptor, actionName); 
     if (ad == null) { 
      wc.defaultViewName = actionName; 
      ad = base.FindAction(controllerContext, controllerDescriptor, "DefaultView"); 
     } 
     return ad; 
    } 

} 

這很好,即使我們沒有控制器上的操作方法,它也會分發CSHTML文件。但是,這不適用於CSS和圖像。

例,

/App/Projects/Search 

容易處理和服務的,我們沒有看到原始CSHTML下載反正。

App/Views/Projects/Search.cshtml 

我需要一些幫助在訪問

/App/Projects/Search.css 
/App/Projects/some-button.png 

在路徑

/App/Views/Projects/Search.css 
/App/Views/Projects/some-button.png 

由於這些不CSHTML,取景器不容易找到他們,也是我需要爲他們服務的靜態下載,除了cshtml,aspx和註冊MIME類型之外的任何東西。

並且爲了增加它,我們還將DisplayModes與移動設備和平板電腦相連,這使得管理資源變得更加困難。

+1

爲什麼在瀏覽文件夾這些資源在〜/ Views文件夾編輯的web.config,允許除.cshtml文件的訪問什麼?視圖文件夾用於...視圖。 –

+0

@AntP當然我知道,資源是CSS,視圖內使用的圖片。 –

+0

將它們放在「css」和「圖像」文件夾中的視圖文件夾之外。 –

回答

0

您無法將任何內容放入需要提供給瀏覽器的視圖文件夾中。這包括CSS(或更少),圖像,JavaScript,無論什麼...

這是因爲MVC不允許視圖文件夾中的任何內容直接出於安全原因的Web請求訪問。視圖通常包含代碼,可以顯示有關服務器的內部信息。有時候人們甚至會做愚蠢的事情,比如把用戶名和密碼放在他們的視圖代碼中。

這是爲了防止有人只是打字到他們的瀏覽器:

http://yoursite/Views/Home/index.cshtml 

爲了下載CSHTML文件。

因此,您根本無法將任何內容放入您希望瀏覽器下載的Views文件夾或任何子文件夾中。

如果你看看你的Views文件夾,你會看到它有它自己的web.config文件。在該文件中,您將找到以下部分,其中添加了一個阻止訪問Views文件夾中任何內容的HttpHandler。我不會建議刪除它,因爲這可能會使您的代碼易受攻擊。

<system.webServer> 
    <handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" 
     type="System.Web.HttpNotFoundHandler" /> 
    </handlers> 
</system.webServer> 
0

我不知道爲什麼不能UI的依賴仍保留在文件夾的內容,並利用捆綁功能打包按次基礎資源。

1

您可以通過添加* .cshtml到path參數

<system.webServer> 
    <handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" 
     type="System.Web.HttpNotFoundHandler" /> 
    </handlers> 
</system.webServer> 
相關問題