组件通信与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) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/2519464.html