2008-09-24 46 views
8

我對視圖的組織方式感到困惑,而且理解這一點很重要,因爲ASP.NET MVC使用約定來使所有的工作都正常工作。ASP.NET MVC中的視圖文件/目錄結構應該是什麼?

在views目錄下有子目錄。這些子目錄裏面是視圖。我假設子目錄映射到控制器,並且控制器對其子目錄中包含的視圖起作用。

這些目錄中包含哪些類型的視圖是否有新的期望?例如,每個目錄的默認頁面應該是index.aspx?頁面是否遵循命名約定,如Create [controller] .aspx,List [controller] .aspx等?或者沒有關係?

回答

7

查看目錄的命名和文件命名非常重要,因爲ASP.NET MVC框架對它們做了某些假設。如果你不符合這些假設,那麼你必須編寫代碼讓框架知道你在做什麼。一般來說,除非你有充分理由不遵守,否則你應該遵守這些假設。

讓我們看看最簡單的可能控制器操作:

public ActionResult NotAuthorized() 
    { 
     return View(); 
    } 

因爲沒有視圖名稱已在調用指定查看(),該框架將推定視圖文件名將是一樣的行動名稱。該框架有一個名爲ViewEngine的類型,它將提供擴展。默認的ViewEngine是WebFormViewEngine,它將使用該名稱並向它附加一個.aspx。所以在這種情況下,完整的文件名將是NotAuthorized.aspx。

但是在哪個文件夾中會找到該文件?再次,ViewEngine提供這些信息。隨着WebFormViewEngine,它將在兩個文件夾:〜/查看/共享和〜/查看/ {控制器}

所以,如果你的控制器被稱爲的AccountController,它看起來在〜/查看/帳戶

但有可能是你不想遵守這些規則的時候。例如,兩個不同的動作可能會返回相同的視圖(使用不同的模型或其他東西)。在這種情況下,如果你在你的行動明確指定視圖名稱:

public ActionResult NotAuthorized() 
    { 
     return View("Foo"); 
    } 

注意與WebFormViewEngine,在「視圖名稱」通常是相同的文件名,擴展名少,但框架不需要其他視圖引擎。

同樣,您可能也有理由希望您的應用程序查找視圖和非默認文件夾。你可以通過創建你自己的ViewEngine來做到這一點。我在this blog post中展示了這種技術,但是類型名稱是不同的,因爲它是爲較早版本的框架編寫的。然而,基本的想法仍然是一樣的。

+0

視圖中的文件夾可以包含子文件夾嗎?如果是這樣,主計長如何接觸他們?例如... Admin/Profile/Edit/1 – 2009-02-10 16:46:28

2

關於預期的意見名稱,我認爲這是每個項目或組織試圖標準化的事情之一。

正如你在你的問題中暗示的那樣,這些視圖中的一些(或者更確切地說是渲染它們的動作)可能全面受歡迎,例如在RoR應用程序中常見的那些視圖REST範例:

  • /orders /(ie指數)
  • /命令/顯示/ 123
  • /命令/編輯/ 123
  • /命令/更新/ 123
  • /命令/新
  • /命令/創建
  • /命令/銷燬/ 123

選擇/視圖的標準化,在很大程度上取決於你如何建模應用程序(的說法明顯),以及如何細粒度你想去的地方。將控制器映射到單獨的模型類(咳嗽...資源......咳嗽)越近,您的動作就會越短,並且更容易您可以遵循標準操作(如上例所示)。

我還認爲,較短的操作有助於將越來越多的模型業務邏輯推入模型本身,它屬於哪裏。

相關問題