精通ASP.NET MVC ——属性路由

在上一篇文章中,有约定路由的介绍。MVC 5中增加了对属性路由这一新技术的支持。在属性路由中,路由是由直接运用于控制器的C#属性定义的。

启动和运用属性路由 

默认情况下属性路由是禁止的,通过MapMvcAttributeRoutes扩展方法可以启用它。该方法由RouteCollection对象调用,如下图所示:

        public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapMvcAttributeRoutes();//启动属性路由routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}

调用 MapMvcAttributeRoutes 方法导致路由系统检查应用系统中的控制器类,并寻找匹配路由属性。最重要的属性是Route。如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

当一个动作方法用Route属性修饰时,它不需要通过约定路由来访问,这意味着Customer控制器中的Index方法不再需要/Customer/Index,也不能用/Customer/Index来访问。 执行效果如下图所示:

 


使用片段变量创建路由 

虽然通过属性表示,但是属性路由支持和基于约定路由一样的特性。这些特性包括创建包含片段变量的路由。如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Users/Add/{user}/{id}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

上述代码中添加了一个带有string 和 int 类型参数的动作方法Create。为了简单起见,返回一个string类型的结果,这样就不用创建一个视图了。 用Route属性定义的路由混合了静态前缀(Users/Add)以及方法参数对应的user 和 id 片段。为了调用Create方法,MVC框架使用模型绑定特性将片段变量转化成正确的类型。运行效果如下图所示:


运用路由约束 

属性路由中的约束更加直接,如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Users/Add/{user}/{id:int}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}[Route("Users/Add/{user}/{password}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

新的动作方法名称为ChangePass,有两个string类型的参数。但是为了区分Create方法,对Create方法中的Route属性运用了约束,[Route("Users/Add/{user}/{id:int}")],指定 id 接收int类型的请求。 运行效果如下图所示:

                              


组合约束 

可以将多个约束运用于一个片段,以便进一步限制路由将要匹配的值的范围,如下图所示:

        [Route("Users/Add/{user}/{password:alpha:length(6)}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}

 使用Route Prefix

可以使用Route Prefix属性定义一个将被运用到控制器所有路由中的普通前缀,当很多动作都使用同样的根URL为目标是,这点特别有用。如下图所示:

    [RoutePrefix("Users")]public class CustomerController : Controller{[Route("~/Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Add/{user}/{id:int}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}[Route("Add/{user}/{password:alpha:length(6)}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

运行效果如下图所示:

                       

以~/为前缀告诉MVC框架,不要运用到Index动作方法的RoutePrefix属性,这意味着它仍然可以通过/Test来访问。 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC 阻止通过URL访问服务器上的静态资源文件

背景 在默认情况下,MVC框架是支持对服务器静态资源的访问的,我们在项目根目录下新建一个Content文件夹,然后添加一个命名为“StaticContent.html”的html文件,如下图所示: StaticContent.html中的代码如下图所示&…

精通ASP.NET MVC——控制器和动作

在MVC框架中,控制器必须实现System.Web.Mvc命名空间的IController接口,如下图所示: //// 摘要:// 定义控制器所需的方法。public interface IController{//// 摘要:// 执行指定的请求上下文。//// 参数:// requestContext:// 请…

精通ASP.NET MVC ——视图

文章非常长,仅仅用于记录自己学习。 创建自定义视图引擎 创建自定义视图引擎的价值是,演示请求处理管道如何工作,并完善关于MVC架构如何操作的知识,视图引擎实现IViewEngine接口,如下图所示: public inte…

使用列表选择框控件

本例使用列表选择框控件,并向其中添加删除列表项,程序运行如下图所示。 程序代码如下。 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace eg38_checklistBoxApp {public partial class Form1 : Form…

精通ASP.NET MVC ——辅助器方法

辅助器方法(Helper Method),其作用是对代码块和标记进行打包,以便能够在整个MVC框架应用程序中重用。 首先新建一个项目,添加一个Home控制器,如下图所示: public class HomeController : Controller{// GET: Homepubli…

精通ASP.NET MVC ——模型绑定

模型绑定(Model Binding)是指,用浏览器以Http请求方式发送的数据来创建.Net对象的过程。 准备示例项目 新建一个空的MVC项目,名叫MvcModels,接下去会以此项目来演示各种功能。 在Models文件夹中创建一个Person.cs类…

精通ASP.NET MVC ——模型验证

文章内容较长,用于记录自己学习。模型验证(Model Vaildation)是确保应用程序所接受的数据适合于绑定到模型,并且在不合适时给用户提供有用的信息,以帮助他们修正问题的过程。 准备示例项目 新建一个空的MVC项目&…

[wbia 2.2] 对检索结果进行评估

评估对检索系统的性能: 由于我们这里的检索结果,是主要根据PageRank的排名,以及Lucene对文本的分词和相关性计算的最后得分,进行权值调整后得到的排名结果。 这里对我们检索系统的进行性能评估,这里主要评估的是检索结…

错误175:具有固定名称MySql.Data.MySqlClient的ADO.NET提供程序未在计算机或者应用程序配置文件中注册或者无法加载

背景: EF连接MySQL时报错,截图如下图所示: 网上翻阅了很多资料,感觉有一篇文章说的比较靠谱:点击阅读。解决问题的大致过程如下: 在尝试使用MySQL,ADO.NET(数据库优先)和…

精通ASP.NET MVC ——URL和Ajax辅助器方法

Ajax(或者,如果你愿意,也可以称为AJAX)是 Asynchronous JavaScripts and XML(异步JavaScripts与XML)。其XML部分并不如它往常那样意义重大,但是异步部分却使AJax十分有用。这是后台请求服务器数据,而不必重载Web页面的一种模型。M…

精通ASP.NET MVC ——控制器可扩展性

MVC中引导动作方法执行过程的请求流程管道中,有两个重要的部件:控制器工厂(Controller Factory) 和 动作调用器(Action Invoker)。控制器工厂负责创建对请求进行服务的控制器实例,动作调用器负责查找并调用控制器类中的…

永中向香港博览会主办方演示云办公(转载)

4月16号“香港国际资讯博览会”主办方香港贸发局对永中云办公产品非常感兴趣,由永中员工演示,并拍摄了演示视频。转载于:https://blog.51cto.com/premium/837675

Backbone.js学习笔记

为什么80%的码农都做不了架构师?>>> http://documentcloud.github.com/backbone var todoItem new TodoItem(); todoItem.url /todo; todoItem.fetch(); todoItem.get(description)var TodoItem Backbone.Model.extend({urlRoot: /todos }); var tod…

ASP.NET MVC中使用Autofac实现简单依赖注入

本文参考资料: 1、https://www.cnblogs.com/RayWang/p/11128554.html。 2、https://www.cnblogs.com/eedc/p/6127181.html 3、https://www.cnblogs.com/ancupofcoffee/p/5007649.html#top 前言 关于IoC和DI(依赖注入)的概念网上一搜一大把。简单来说,Io…

初探EntityFramework——来自数据库的EF设计器

本文通过简单的示例,先初步了解下EF四种设计模式之一:来自数据库的EF设计器。 来自数据库的EF设计器,顾名思义,需要有新建的数据库和表结构,才能生成EF设计器, 在本地新建数据库KTStore,并且新建…

初探EntityFramework——空EF设计器模型

如果没有任何现存数据库架构,可以使用空的EF设计器模型。本文将通过简单示例,了解如何使用空EF设计器模型。 新建空的控制器应用程序EFDesignerDemo,如下图所示: 在项目中右键,选择“添加”,然后是“新建项…

初探EntityFramework——来自数据库的Code First

Entity Framkwork从第二版(EF4)开始,支持新的CodeFirst模式(程序代码优先),以自定义类定义数据模型。简化了EF的开发过程。本文章使用简单的示例来说明如何使用来自数据库的CodeFirst模式。 新建一个空的控…

初探EntityFramework——空Code First模型

如果不是从现有的系统升级,想要创建全新的项目可以从“空Code First模型开始”。“空CodeFirst模型”要先创建类,Visual Studio会从项目第一次执行的时候根据连接自动创建需要的数据库结构。本文将简单示例说明如何使用“空CodeFirst模型”。 新建控制台…

初探EntityFramework——实体类结构映射

实体类与数据表的映射有一套专用的规则。Code First 采用的惯例优于预先设置的设计,在没有任何设置的情况下,自动检测模型结构并推导出默认设置以简化类的设计,因此不需要特别设置类的属性即可完成模型设计。 例如,当DbContext的模…

深入了解EntityFramework——数据注解属性

当惯例规则不符合设计需求时,我们可以使用数据注解配置打造更合适的数据库模型。本文根据示例项目对常用的数据注解属性做一个简要的举例说明。 EFCodeFirst使用的约定大于配置的的编程模式, 这种模式利用默认约定根据我们的领域模型建立概念模型。然我们…