• 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

    image

    而不像普通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项目

            image

    image

    如上图,项目目录组成:  

    Code 存放自定义的类(比如 User类,Filter类(后面介绍到));

    Context存放CSS。

    Model 数据模型 updatemodel等

    Controllers  存放控制器,控制器name必须由名字+Controller 组成,而且名字要和Views中要有以这个名字命名的文件夹。如图有个UserContrller,则Views 同样有个 User文件夹。

    Views存放视图image 。  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无法访问

    image

    必须改成  user.controller才能访问。

    image

    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]

  • 相关阅读:
    How to load yaml file in python
    sqlserver 执行计划
    数据库迁移
    运维python算法面试
    Python中的 if __name__ == '__main__' 是什么意思?
    Linux CPU,TCP性能瓶颈排查
    SHELL转义字符$
    Excel插入PivotTable透视图表设计统计
    查看server握手链接是否有积压
    Linux查看历史IO信息
  • 原文地址:https://www.cnblogs.com/StudyLife/p/2577157.html
Copyright © 2020-2023  润新知