zoukankan      html  css  js  c++  java
  • 组件通信与ASP.NET Routing

    记得在上篇文章说道MVC三组件间的通信。通信,顾名思义,就是两个媒介之间交换或共享信息(我的理解哈,哈哈哈)。在ASP.NET MVC中,Model、View,Controller是如何通信的呢?先看一张图。

      解释一下:说道MVC中的通信,首先要考虑的肯定是Controller与View之间的通信,因为Controller和Model的通信很简单,就是Controller对Model中类的调用(或许这样说有点不对)。但是在对ASP.NET不很了解的时候,我经常把View和Brower等同起来。其实不然,当我们输入Url,Brower(浏览器)会想Controller Class发送一个请求(在一般的应用程序中,Url会指向一个屋里文件,如.aspx、.html等),然后Controller经过数据处理后,返回一个View,经过视图引擎(ASPX、Razor)的解析会转化成Html、Css等发送至浏览器呈现。这和我以前理解的Controller发送数据至View完全是两码事。

      下面回到正常的MVC,再看一张图。

      

      解释一下:

        1、在View中,用户提交(submit)数据后,经过ASP.NET Routing,发送request(常见的包括Url、表达提交和Ajax等)至Controller(Class)。

        2、在Controller经过过滤器处理、简单的逻辑处理(主要的逻辑处理放在Model中,但是通常Controller也会进行一下简单的逻辑处理)、与Model通信(程序集、类、方法、属性等的调用)之后发送ActionResult、ViewBag、ViewState等给View。

        3、在View中进行Binding(数据绑定,比如,强类型绑定等等)。

        4、然后就要回到我们第一张图了,经过视图引擎的解析,Html、Css等会发送至Browser进行解析和展示。

      可以看出,在MVC的通信中,ASP.NET Routing占了很重要的位置。ASP.NET Routing--ASP.NET 路由,可以完美的路径映射。关于ASP.NET Routing网上有很多大牛都有论证,可参见(http://msdn.microsoft.com/zh-cn/library/cc668201.aspx)。这里就不班门弄虎了,直说几点。

      一、用ASP.NET Routing配置伪静态。

        routes.MapRoute(
          "Html1", // 路由名称
          "{controller}/{action}.html", // 带有参数的 URL
          new { controller = "Home", action = "Index" } // 参数默认值
        );
         routes.MapRoute(
          "Html2", // 路由名称
          "{controller}/{action}/{id}.html", // 带有参数的 URL
          new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
        );

        以前在学校的时候,查阅了很多伪静态的资料,后来到底怎么样了不知道,直接让我伤了一些脑经。当然这两句是放在Default的上面,但是不能不要Default,因为去掉当“http://localhost:XXX/”这样访问的时候会报错。明白了哇。

      二、可选参数。

        经过ASP.NET Routing的映射,请求到达Controller时候,请求的参数会中和Action方法的参数匹配。下面做几个比较,如下: 

         public ActionResult Index(int id=0)
           
    {
               
    return View();
           
    }
         public ActionResult Index(string id)
           
    {
               
    return View();
           
    }
         public ActionResult Index(int id)
           
    {
               
    return View();
           
    }
         public ActionResult Index(int? id)
           
    {
               
    return View();
           
    }
        这里有四个看似一样的Action,当我们以“http://localhost:xxx/”访问的时候,第三种无法通过,信息如下:
          对于“XXX”中方法“System.Web.Mvc.ActionResult Index(Int32)”的不可以为 null 的类型“System.Int32”的参数“id”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。参数名: parameters
        
    在C#中,数据类型分为值类型和引用类型。引用类型肯定是可以为null的,但是值类型(如:int),所以在C#为俺们提供了可空类型--->可选参数。同时默认值也是一个很好的用法。

      三、接收表达提交的参数。

      @using (Html.BeginForm("CreateNewCountry", "Home", FormMethod.Post))
      {
        <fieldset>
          <legend>Create A New Country</legend>
          <div class="editor-label">
            @Html.LabelFor(m => m.CountryID)
          </div>
          <div class="editor-field">
            @Html.TextBoxFor(m => m.CountryID)
            @Html.ValidationMessageFor(m => m.CountryID)
          </div>
          <div class="editor-label">
            @Html.LabelFor(m => m.CountryName)
          </div>
          <div class="editor-field">
            @Html.TextBoxFor(m => m.CountryName)
            @Html.ValidationMessageFor(m => m.CountryName)
          </div>

          <p><input type="submit" value="Submit" onclick="if(confirm('验证啦。。。'))return true;else return false;" /></p>

        </fieldset>
      }

      [HttpPost]
      public ActionResult CreateNewCountry()
      {
        Request["CountryName"]........
        return View(country);
      }

      这里,我们完全可以像ASP.NET一样,利用Request去接收参数,但是阿斯ASP.NET MVC中不建议这么做。这里建议用FormCollection,代码如下:

      [HttpPost]
      public ActionResult CreateNewCountry(FormCollection values)
      {
        values["CountryName"]........
        return View(country);
      }

      当然,这里接收参数完全可以用强类型。

      四、ASP.NET Rouging在ASP.NET中的应用。

        1、新建一个ASP.NET WEB应用程序,打开Global.asax。添加下面代码:

        、、、、、、

        using System

        、、、、、、

        void Application_Start(object sender, EventArgs e)
        {
          // 在应用程序启动时运行的代码
          RegisterRoutes(RouteTable.Routes);
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
        routes.MapPageRoute("",
          "Home/Index",
          "~/Default.aspx");
        }

      运行引用程序,可以看到,“http://localhost:51635/Default.aspx”和“http://localhost:51635/Home/Index”,可以看到两个都会去访问Default.aspx页面。哈哈,有种又回到ASP.NET MVC的感觉,做这个就是想说明两个问题:

      1、ASP.NET Routing并不是应不是ASP.NET MVC独有,他可用于任何.NET Web应用程序。

      2、可看到,这里既可以用Home/Index格式访问,也可以用Default.aspx访问。为什么在ASP.NET MVC中直接访问Views/Home/Index.cshtml就要报错呢???是因为在ASP.NET MVC中Url只能访问Controller Class---控制器类(注意类和物理文件),由Action放回View,而不能直接访问物理文件。

      五、ASP.NET Routing和URL Rewriter的区别

        这里只想说一点他们两个的最大区别:URL Rewriter是在请求之前重写URL,然后由重写后的URL去访问某个处理程序。但是ASP.NET Routing不一样,他是在请求中截取URL,然后进行URL的重定向。这就会导致一种结果。就是UrlRewriter不知道重写前的URL会去访问哪一个处理程序,他只管按照一定的规则(正则表达式)进行重写。但是ASP.NET Routing却知道。

        哦,还有第二个比较大的区别。ASP.NET Routing只支持NET Web应用程序,但是URL Rewriter不一样,他支持任何web应用程序。哈哈。。又是一个跨平台的问题。

    ok。这里指说明了一些ASP.NET Routing的用的时候的小细节。网上有很多教程是讲这个的,除了上面推荐的,在保存一个:http://www.cnblogs.com/chsword/archive/2008/08/27/System_Web_Routing_1.html

     

     
    分类: ASP.NETMVC

    ASP.NETMVC

     
    摘要: 记得在上篇文章说道MVC三组件间的通信。通信,顾名思义,就是两个媒介之间交换或共享信息(我的理解哈,哈哈哈)。在ASP.NET MVC中,Model、View,Controller是如何通信的呢?先看一张图。 解释一下:说道MVC中的通信,首先要考虑的肯定是Controller与View之间的通信,因为Controller和Model的通信很简单,就是Controller对Model中类的调用(或许这样说有点不对)。但是在对ASP.NET不很了解的时候,我经常把View和Brower等同起来。其实不然,当我们输入Url,Brower(浏览器)会想Controller Class发送一个请...阅读全文
    posted @ 2012-05-26 17:44 堂堂88 阅读(144) | 评论 (0) 编辑
     
    摘要: 初始MVC的问都想问:啥子事MVC哦?其实一般的人都能回答:MVC就是“模型”、“视图”、“控制器”。如果能再加上一张图(如下),那就堪称完美了。 当初我会下意识的点点头,其实心里啥子都不知道,只知道三个字母分别对应了三种意思。现在想想,觉得当初还是蛮可爱的。从上图,我们至少可以看出两点: 第一、MVC模式由模型、视图和控制器三个组件组成。 第二、这三个组件之间存在通信行为。(如果是高手可能还可以看出上图的通信方式,但是我看见了还是以脑袋的浆糊,不知所以。) 通过解释和图片,看出了两点,或许皮毛都没沾上。但是,细想之下,一定能提出很多疑问: 第一、MVC模式有Model、View...阅读全文
    posted @ 2012-05-11 17:42 堂堂88 阅读(1040) | 评论 (1) 编辑
     
    摘要: (1)三层架构和MVC模式。 不知道大家有没有和我的类似经历。记得大学一次看见班长在学习JAVA中的MVC。就很好奇的问:班长,MVC到底是啥子嘛?)班长回答了半天总结出一句话:MVC就是“控制器,视图,模型”,和三层架构差不多。难道MVC就是分别对应了三层架构中的“DAL,BLL和UI”?下面分别分析下三层架构和MVC模式。 三层架构,在长期的软件开发过程中,人们经历了"UI"--->“UI+BLL”---> “UI+BLL+DAL”三种时代--->.....。 UI层时代:人们通常把所有的表现、业务逻辑和数据库访问的代码都放在一起。这样做的结果是维护起阅读全文
    posted @ 2012-05-09 17:31 堂堂88 阅读(1319) | 评论 (6) 编辑
  • 相关阅读:
    prometheus学习系列三:node_exporter安装部署
    prometheus学习系列一: Prometheus简介
    prometheus学习系列二: Prometheus安装
    crontab定时任务不执行,单独运行sh生效
    glusterfs+heketi为k8s提供共享存储
    kubernetes的安装方法
    阿里云负载均衡权重管理脚本
    ldap配置系列二:jenkins集成ldap
    ldap配置系列一:ldap的安装
    ldap配置系列三:grafana集成ldap
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2519464.html
Copyright © 2011-2022 走看看