ASP.NET MVC学习之控制器篇
一.前言
許久之后終于可以繼續(xù)我的ASP.NET MVC連載了,之前我們?nèi)娴闹v述了路由相關(guān)的知識(shí),下面我們將開(kāi)始控制器和動(dòng)作的講解。
ASP.NET MVC學(xué)習(xí)之路由篇幅(1)?
ASP.NET MVC學(xué)習(xí)之路由篇幅(2)?
ASP.NET MVC學(xué)習(xí)之路由篇幅(3)?
?
二.正文
?
1.IController的使用
這個(gè)接口可能很多人都沒(méi)有使用過(guò),但是我們常用的Controller類(lèi)實(shí)現(xiàn)了這個(gè)接口,而且只要實(shí)現(xiàn)這個(gè)接口就可以作為一個(gè)控制器,當(dāng)然很多的內(nèi)部的處理就要我們自己去做了。
下面我利用IController實(shí)現(xiàn)根據(jù)路由參數(shù)調(diào)用不同的方法:
1 public class HomeController : IController 2 { 3 public String Index() 4 { 5 return "<h1>Index</h1>"; 6 } 7 8 public String Show() 9 { 10 return "<h1>Show</h1>"; 11 } 12 13 public String Home() 14 { 15 return "<h1>Home</h1>"; 16 } 17 18 public void Execute(System.Web.Routing.RequestContext requestContext) 19 { 20 string action = requestContext.RouteData.Values["action"].ToString(); 21 Type t = typeof(HomeController); 22 MethodInfo mi = t.GetMethod(action, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 23 if (mi == null) 24 { 25 requestContext.HttpContext.Response.Write("<h1>404</h1>"); 26 } 27 else 28 { 29 string s = mi.Invoke(this, null).ToString(); 30 requestContext.HttpContext.Response.Write(s); 31 } 32 } 33 }?首先我們實(shí)現(xiàn)IController接口的Execute方法,然后在外面定義幾個(gè)我們需要調(diào)用的方法,然后在Execute方法中獲取action的參數(shù),并通過(guò)反射技術(shù)獲取對(duì)應(yīng)的方法,如果能夠獲取到該方法則調(diào)用該方法并返回,否則返回404。
上面僅僅只是簡(jiǎn)單的列子,而且大多數(shù)時(shí)候我們并不需要實(shí)現(xiàn)IControler接口。
?
?
2.成熟的Controller
前面我們可以發(fā)現(xiàn)如果我們利用IController去實(shí)現(xiàn)控制器會(huì)非常的麻煩,但是實(shí)際上我們最終都是使用的是Controller類(lèi),
它已經(jīng)實(shí)現(xiàn)了很多功能,這樣我們就可以關(guān)注于功能而不是底層的實(shí)現(xiàn)。有過(guò)ASP.NET開(kāi)發(fā)的人一定知道,很多數(shù)據(jù)都是使
用Request.QueryString,RouteData來(lái)獲取的。
?
但是在ASP.NET MVC中可以更簡(jiǎn)便的獲取,比如下面的代碼:
1 public class UserController : Controller 2 { 3 4 public ActionResult Index(string path) 5 { 6 ViewBag.Path1 = path; 7 return View(); 8 } 9 10 }?上面的代碼僅僅只是簡(jiǎn)單的將傳入的path屬性存到視圖包中以便頁(yè)面輸出。
(首先我們還要新建對(duì)應(yīng)的視圖頁(yè)面,頁(yè)面的代碼如下)
1 <h2>@ViewBag.Path1</h2> 2 @using (Html.BeginForm()) 3 { 4 @Html.Editor("path") 5 <input type="submit" value="submit" /> 6 }?
下面我們通過(guò)這個(gè)路徑訪問(wèn)頁(yè)面:http://localhost:1201/User/Index?path=12
那么最終的頁(yè)面就會(huì)如下所示:
?
?
我們可以看到uri中存在了path屬性的值所以后臺(tái)的path就是12,所以頁(yè)面上輸出是12,細(xì)心的人會(huì)發(fā)覺(jué)input里面顯示的值也會(huì)跟著uri中path變化。
上面我們僅僅是通過(guò)uri改變呢,下面是通過(guò)form表單來(lái)傳遞path的值,我們?cè)?strong>input中輸入一個(gè)值,然后點(diǎn)擊submit,我們可以看到如下的結(jié)果:
這里我們可以看到當(dāng)我們的輸入框的值是什么,最后頁(yè)面輸出的值也是這個(gè)輸入的值。
?
?
3.動(dòng)作結(jié)果
無(wú)論控制器如何的強(qiáng)大不能生成用戶希望的頁(yè)面,一樣也會(huì)毫無(wú)用武之地。下面我們就是要學(xué)習(xí)幾種動(dòng)作結(jié)果:
?
A.View
這個(gè)動(dòng)作結(jié)果,很多人都不會(huì)陌生,因?yàn)橐粍?chuàng)建控制器之后都會(huì)有一個(gè)默認(rèn)的Index動(dòng)作其中就是返回View,但是這里你要知道如果直接返回View那么對(duì)應(yīng)的視圖文件會(huì)按照Views/控制器名/動(dòng)作名.cshtml去查找,
當(dāng)然如果找不到還會(huì)對(duì)其他公共頁(yè)面進(jìn)行搜索,但是我們還可以自行指定:
?
首先我們?cè)?strong>Views/User/下新建一個(gè)SubIndex.cshtml視圖,然后修改UserController中的Index方法代碼:
1 public ActionResult Index() 2 { 3 return View("SubIndex"); 4 }?
?
這里我們可以看到我們直接將視圖的名稱作為參數(shù)傳遞給View,但這些僅僅只是控制顯示的視圖,我們最終還需要將控制器中的數(shù)據(jù)傳遞到視圖,
供視圖去顯示,這里我們可以介紹四種方式,ViewBag,ViewData,TempData,Model,下面我們用一段代碼來(lái)演示下:
1 public class UserController : Controller 2 { 3 4 public ActionResult Index() 5 { 6 ViewBag.Show = "From ViewBag"; 7 ViewData["Show"] = "From ViewBag"; 8 TempData["Show"] = "From TempData"; 9 object obj = "From Model"; 10 return View(obj); 11 } 12 13 }?
?
這里我們?cè)诟鞣N傳遞方式中賦值,下面就是對(duì)應(yīng)的視圖:
1 <h2>@ViewBag.Show</h2> 2 <h2>@ViewData["Show"].ToString()</h2> 3 <h2>@TempData["Show"].ToString()</h2> 4 <h2>@Model</h2>?
?
然后我們重新編譯,刷新頁(yè)面之后最終結(jié)果如下:
?
這里有一個(gè)要稍微介紹下,就是TempData,其實(shí)它主要是用來(lái)將數(shù)據(jù)傳遞到其他頁(yè)面的,所以他有一些特性,就是當(dāng)從中讀取了數(shù)據(jù)之后就會(huì)將該數(shù)據(jù)從中清除,除非使用Peek方法讀取,那么該數(shù)據(jù)就不會(huì)被標(biāo)記為刪除,
如果想刻意的將某個(gè)數(shù)據(jù)去除刪除標(biāo)記,可以使用Keep方法。相關(guān)的示例這里我就不列舉了。
?
B.重定向
既然是開(kāi)發(fā)網(wǎng)站,既然就會(huì)有跳轉(zhuǎn)頁(yè)面的功能,下面我們就會(huì)集中講述ASP.NET MVC中提供的重定向功能。
首先是最簡(jiǎn)單的重定向,就是直接根據(jù)我們提供的路徑跳轉(zhuǎn):
1 public class UserController : Controller 2 { 3 public ActionResult Index() 4 { 5 return Redirect("/Home/Index"); 6 } 7 }?
?
這里我們可以看到Redirect中我們直接傳進(jìn)了Home控制器額Index動(dòng)作的路由路徑,我們打開(kāi)這頁(yè)面就可以發(fā)現(xiàn)進(jìn)行了跳轉(zhuǎn)。
如果你學(xué)會(huì)HTTP一定會(huì)知道重定向中還有一個(gè)叫永久重定向,如果我們需要使用的話,可以利用RedirectPermanent方法。
?
通過(guò)上面我們看到這樣需要輸入完整的路徑,當(dāng)然ASP.NET MVC已經(jīng)提供給我們其他的快捷的方式,比如下面的這種方式:
(我們需要在UserController中添加Show動(dòng)作,同時(shí)添加對(duì)應(yīng)的視圖)
1 public class UserController : Controller 2 { 3 public ActionResult Index() 4 { 5 return RedirectToAction("Show"); 6 } 7 8 public ActionResult Show() 9 { 10 return View(); 11 } 12 }?
?
這里我們看到RedirectToAction中傳入了Show,其實(shí)這里就代表這個(gè)重定向會(huì)跳轉(zhuǎn)到Show動(dòng)作中,如果需要永遠(yuǎn)重定向可以使用RedirectToActionPermanent方法。
但有時(shí)我們需要更加靈活的方式去重定向,那么我們就可以使用下面的方式:
1 public ActionResult Index() 2 { 3 return RedirectToRoute(new { controller = "Home", action = "Index" }); 4 }?
?
這里我們是直接通過(guò)傳遞構(gòu)成該請(qǐng)求的控制器參數(shù),動(dòng)作參數(shù)構(gòu)成最終的路由,當(dāng)然我們也可以傳遞其他額外的參數(shù)到其中,
如果需要永遠(yuǎn)重定向則使用RedirectToRoutePermanent方法。
?
C.其他
這里我們不每個(gè)去舉例了,下面是其他的動(dòng)作結(jié)果:
Json : 將c#類(lèi)轉(zhuǎn)換成json格式
Javascript?? :? 傳遞javascript代碼
Content? : 傳遞其他格式的字符數(shù)據(jù)
File : 傳遞文件流
HttpNotFoound : 404錯(cuò)誤
?
由于最近忙于測(cè)試,所以沒(méi)有時(shí)間去寫(xiě)隨筆了,這篇隨筆是利用下班在家每天寫(xiě)一些最后寫(xiě)出來(lái)的。當(dāng)然水平上沒(méi)有前兩篇那么細(xì)膩了。
?
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC学习之控制器篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一升油多少磅(一升92号汽油等于几磅)
- 下一篇: unicode编码问题