MVC學習——M/V/C分工模式

學習自:http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html

http://www.cnblogs.com/youring2/archive/2011/07/06/2091715.html


一、新建一個ASP.NET.MVC,內容如下:


在不對項目進行任何修改的情況下,直接按CTRL+F5,運行項目,運行結果如下:


這是一個404錯誤,指定的頁面未找到。在項目運行時,Mvc3會將頁面請求進行映射。接下來我們爲項目添加一個Home頁。

添加一個名爲Home的控制器:


控制器的名稱必須以Controller爲結尾。

然後修改HomeController中的代碼:

public string Index()
{
return"<h1>Hello world by Mvc3</h1>";
}

運行之後:


修改控制,添加一個名爲Welcome的方法,代碼如下:

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

在Welcome方法的代碼塊中,點擊右鍵,在上下文菜單中選擇“添加視圖”,打開添加視圖對話框:

在這個對話框中不做任何修改,點擊“添加”按鈕,完成視圖的添加,VS會在View文件夾下牀架如下結構的文件:

編譯項目,在瀏覽器地址欄中輸入地址:http://localhost:xxx/home/Welcome(xxx爲端口號,在不同的計算機中會有所不同),運行結果如下:

  step6.使用ViewBag傳遞參數

繼續修改控制器中的Welcome方法,爲它添加一個名爲name的string類型參數,修改後的代碼如下:

public ActionResult Welcome(string name="")
{
ViewBag.name 
= name;
return View();
}

  我們在這裏使用了ViewBag屬性,它是一個新的MVC3屬性,MVC2 中的控制器支持 ViewData 屬性,允許通過後綁定的字典將數據傳送給視圖模板,在 MVC3 中,你可以通過 ViewBag 來更加簡單的完成。例如,對於 ViewData["Message"] = "text",你可以通過 ViewBag.Message = "text" 來完成。你不需要通過類來定義任何強類型的屬性,因爲這是動態屬性,在內部,ViewBag 屬性以名-值對的形式保存在 ViewData 字典中。注意,在許多預發佈版本中,這個屬性被稱爲 ViewModel。

  相應的,我們修改View中的代碼,修改後的代碼如下:

@{
ViewBag.Title 
="Welcome";
}

<h2>Hi @ViewBag.name, you're welcome!</h2>

ViewBag.Title是用來顯示當前頁面的標題的。

ViewBag.name使我們在控制器中添加的屬性,在這裏可以直接使用。

編譯項目,修改剛纔在瀏覽器中輸入的地址,爲它添加一個名爲name的參數,地址如下:http://localhost:xxx/home/Welcome?name=Tom,運行界面如下:

  你也可以試試不加參數的情況,直接使用地址:http://localhost:xxx/home/Welcome,程序也是可以正常運行的,只不過輸出的結果爲“Hi , you're welcome!”,這時因爲我們爲參數name指定了默認值,它變成了一個可選的參數,在沒有傳入參數的時候,會採用默認值“空字符串”,所以會有這個輸出結果。

二、是怎樣根據地址欄的URL輸出呢??

我們看到Views中Home下有Welcome.cshtml:

如果我們將路徑寫成:http://localhost:12183/Views/Home/Welcome.cshtml,會出現下面的情況:


Oh,No!路徑是對的,文件也存在,但爲什麼會是404,說找不到文件呢?如果不是直接訪問存在的物理文件,那麼MVC又是怎樣工作的呢?

原來MVC模式是這樣工作的:
image

在MVC中,客戶端的所請求的URL是被映射到相應的Controller去,然後由Controller來處理業務邏輯,或許要從Model中取數據,然後再由Controller選擇合適的View返回給客戶端。再說回前面我們運行的ASP.NET MVC程序訪問的http://localhost:2176/Home/Index這個URL,它訪問的其實是HomeController中的Index這個Action,見下圖:

image

其中public ActionResult Index()這個方法稱爲Controller的Action,他返回的是ActionResult的類型。一個Controller可以有很多個Action。


我們知道了一個URL是怎樣定位到相應的Controller中去的了,那麼View又是怎麼被返回給客戶端的呢?我們從前面的截圖中看到,Controller中的Action方法中有個return View()的方法。默認情況下它會返回與Action同名的view.在ASP.NET MVC默認的視圖引擎(WebFormViewEngine)下,view是按如下路徑訪問的:

/Views/{Controller}/{Action}.aspx

也就是說對於http://localhost:2176/Home/Index這個路徑,在默認情況下,在Index這個Action中用return View()來返回view的時候,會去尋找/Views/Home/Index.aspx文件,如果找不到這個文件,就會去Share目錄中尋找:/Views/Share/Index.aspx,如果都找不到,就會拋出找不到View的異常。return View("lulu.aspx")來指定要返回哪一個view:/Views/Home/lulu.aspx。

那麼爲什麼前面我們直接訪問Views/Home/Index.aspx這裏文件的時候會出現404錯誤,說找不到文件呢?因爲在MVC中,是不建議直接去訪問View的,所以我們建立的ASP.NET MVC程序在默認情況下就在Views目錄下加了一個web.config文件,內容如下:

image

也就是訪問Views目錄下的所有的文件都會由System.Web.HttpNotFoundHandler來處理,所以請不要將資源文件(CSS、JS、圖片等)放到Views目錄中。如果你確實要放到Views目錄下的話,請修改Views/web.config文件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章