MVC 学习日志1(上)
2012.7.5 開始學習MVC,本以為這個框架多難學,學下來的感受是其實也就是編寫格式而已,和普通的webform有質的區別。頓時理解那句老話,世上無難事,只怕有心人。只要開始和堅持,那么結果一定不會差。好了,言歸正傳,下面開始記錄學習MVC的一些學習要點,也許沒那么系統,沒書上那么循序漸進,具體以實例和不同要點記錄下來,只為自己回頭可以看看。如果有時間的話,一定回頭改之,希望自己也能向那些大牛一樣可以做一個系列。
?
?
1. MVC 介紹
MVC (Model,View,Controller),模型,視圖,控制器。
模型主要負責處理數據;控制器負責接受web請求,控制器中的Action 負責返回某個View,View是顯示的內容。
?
例: localhost:xxx/user/index????????? 此處訪問的是項目下? UserController下的index? Action
而不像普通Webform框架下有具體的Aspx頁面,localhost:xxx/user/index/a.aspx。 這個Url在webform下可以正常訪問,在MVC框架下是不行的。
另外:MVC框架設計原則是拒絕 runat=”server” 此類框架的,所以最好不要在MVC框架的項目中不要使用這種控件。
?
?
?
2.? MVC 框架學習
???? 有很多MVC框架,譬如大家常說的:Struts2,Spring,Hibgrade.
???? 本系列使用的是 微軟自己的MVC框架------ Asp.net MVC 2.0.至于其他比較好的框架,大家可以直接學習,但是個人認為還是從 微軟的MVC框架開始。 這就像 Javascrpt 和 Jquery ,extjs 框架一樣,肯定學好了Javascript再去學Jquery,extjs 這樣,肯定易如反掌。畢竟都是Javascript的封裝而已,就像你自己寫的特殊函數封裝而已。
?
?????? VS2008 簡體中文版,打了sp1補丁后,裝上MVC2.0 模版之后開始
??????? 模版下載鏈接:
????? 1)新建MVC項目
?
???????
?
?
如上圖,項目目錄組成:??
Code 存放自定義的類(比如 User類,Filter類(后面介紹到));
Context存放CSS。
Model 數據模型 updatemodel等
?
Controllers? 存放控制器,控制器name必須由名字+Controller 組成,而且名字要和Views中要有以這個名字命名的文件夾。如圖有個UserContrller,則Views 同樣有個 User文件夾。
Views存放視圖 。? Views根目錄下有幾個文件夾,則項目應該就有幾個Controller,而且名字要和Views子文件夾名字相同。? 另:此目錄下的Shared 存放公共模版。
?
?
?
?
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; ? namespace MvcApplication1.Controllers { [HandleError] [MvcApplication1.Code.ParamFilter] public class HomeController : Controller { public ActionResult Index() { ? ? ? ? ? ViewData["Message"] = "Welcome to ASP.NET MVC!"; ViewData["TEST"] = "Viewdata_test"; ? ? MvcApplication1.Code.mycode code = new MvcApplication1.Code.mycode(); code.Name = "王先生"; code.Id = "001"; ViewData["user"] = code; ? ? List<string> ViewDataList = new List<string>(); ViewDataList.Add("a"); ViewDataList.Add("b"); ViewDataList.Add("c"); ? ? ViewData["ViewDataList"] = ViewDataList; ? //TempData["ddd"] = "ddd:為TempData,只能用1次"; //Response.Redirect("about"); return View(); //默認Home/index view } ? public ActionResult About() { return View(); } } } ??
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>html helper <%=Html.ActionLink("超級鏈接到about","about") %></h2> <h2>url helper <%=Url %></h2> <h2><%= Html.Encode(ViewData["Message"]) %></h2> <h2><%=ViewData["TEST"]%></h2> <h2><%foreach (string str in ViewData["ViewDataList"] as List<string>){%></h2> <li> <%=str%> </li> <%} %> ? <h2><% =(ViewData["user"] as MvcApplication1.Code.mycode).Name %></h2> <p> To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. </p> </asp:Content>?
?
以上就是大概情況。
小總結:?? localhost:3373/home/index????????????
訪問的是Controller文件夾下的HomeContrller控制器中的index action。顯示的東西由view決定,具體顯示哪個view由action決定(return view(“xx”))。
?
3.? 關鍵要點
?
1) ViewData 傳值????? Contrller中的Action定義 ViewData[“name”]=”Mike”
??????????????????????????????? View 使用? <%=ViewData[“name”]%>
?
???? 例:?? Controller定義ViewData變量:
??????????? List<string> ViewDataList = new List<string>();
?????????? ViewDataList.Add("a");
?????????? ViewDataList.Add("b");
?????????? ViewDataList.Add("c");
?????????? ViewData["ViewDataList"] = ViewDataList;
?
???????? View中使用ViewData變量:
????????? <%?? foreach(string str in? ViewData[“ViewDataList”] as List<string>){?? %>
<li><%= str%></li>
<% }?? %>
?
?
2.? TempData傳值??? 類似 ViewData。
??? 但是這個值只保存一次。Index action 定義了
TempData[“onlytime”]=”只能訪問一次”;? return view(“edit”)
則在 跳轉到edit view 會顯示tempdata值,刷新后就沒了。
?
3.ViewData? 其他傳值方式? 例如? 類,只要在View端做好 類型轉換就可,然后直接訪問屬性或者字段。
?
另:VS 自動生成屬性快捷: prop+tab+tab
?
4. 重定向? (4種寫法)
?? 假如在UserContrller 中的 Index action 中重定向。
??
?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
??? public class UserController : Controller
??? {
??????? //
??????? // GET: /User/
??????? public ActionResult Index()
??????? {
????????????
?????????????? return? view();? //默認訪問views文件夾下User文件夾下的index視圖
?????????????? return? view(“xx”);??
?????????????? Response.Redirect(“xx”);
?????? return? Redirect(“xx”);
?????? return? RedirectAction(“eidt”,”home”);
}
??? }
}
?
注意:?
?????????????? return? view(“xx”);??
?????????????? Response.Redirect(“xx”);
?????? return? Redirect(“xx”);
前3種方式,只能訪問當前Controller 名字的View 視圖。
?????? return? RedirectAction(“eidt”,”home”);? --只有這個可以指定到別的 View
?
?
?
5. URLROUNTING 路徑選擇
??? Global.asax? 定義。
?
?? 默認的Url路徑:? localhost:3373/home/index???? 這個就是在 Global.asax 定義的。
?? 如果Url這樣才能訪問:localhost:3373/home.Controller/index? 就得修改Global
?
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; ? namespace MvcApplication1 { // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); ? routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); ? } ? protected void Application_Start() { AreaRegistration.RegisterAllAreas(); ? RegisterRoutes(RouteTable.Routes); } } }?
修改并并運行:
routes.MapRoute(
??????????? "Default", // Route name
??????????? "{controller}.controller/{action}/{id}", // URL with parameters
??????????? new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
??????? );
則下圖的Url無法訪問
必須改成? user.controller才能訪問。
?
?
?
?
?
6.? Filer
???? 決定是Action之前用,還是之后;? 決定return view 之前,還是之后做。
????
??? 定義Filer? ,繼承? System.Web.Mvc.ActionFilterAttribute ,然后重寫4個方法
?
using System; using System.Collections.Generic; using System.Linq; using System.Web; ? namespace MvcApplication1.Code { public class ParamFilter:System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); } ? public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); } ? public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); } ? public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext) { ? //if (string.IsNullOrEmpty(filterContext.HttpContext.Request.QueryString["k"])) //{ // throw new Exception("發生了一個錯誤"); //} } } } ??
?
?
?
Controller 使用 Filer
?
在Controller 外加上? [MvcApplication1.Code.ParamFilter]
或在具體的Action 上加? [MvcApplication1.Code.ParamFilter]
posted on 2012-07-05 07:57 水墨.MR.H 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/StudyLife/archive/2012/07/05/2577157.html
總結
以上是生活随笔為你收集整理的MVC 学习日志1(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余额宝没银行卡能用吗
- 下一篇: 京汉股份是做什么的