本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节。 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定义格式的路由时,有几点要注意:

1、arg1/arg2/arg3 的部分应该在 routes.MapRoute 中设置默认值UrlParameter.Optional,才允许同时访问只传部分值比如 只传 arg1,或者 arg1/arg2 这样的路径

2、在设置默认值的情况下,如果出现 http://localhost/Home/About/arg1//arg3 这样的链接,到底arg2是否有传值进来?

3、对于http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的链接,到底 arg1取的是1还是11?

以下为路由配置的代码,并没有为test1和test2设置参数默认值

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "ShowAbout",
url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}",
defaults: new { controller = "Home", action = "ShowAbout", arg1 = UrlParameter.Optional}
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

以下为HomeController中的相关代码

public JsonResult ShowAbout(string arg1, string arg2, string arg3) {
return Json(arg1 + "," + arg2 + "," + arg3, JsonRequestBehavior.AllowGet);
}

当我们访问链接 http://localhost/Home/ShowAbout/arg1/arg2/arg3 时,会出现如下结果:

"arg1,arg2,arg3"

但如果少了一个参数,比如访问 http://localhost/Home/ShowAbout/arg1/arg2 ,则会出现 404 的错误

这种情况下,需要在RouteConfig中配置默认值

routes.MapRoute(
name: "ShowAbout",
url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}",
defaults: new {
controller = "Home",
action = "ShowAbout",
arg1 = UrlParameter.Optional,
arg2 = UrlParameter.Optional,
arg3 = UrlParameter.Optional
}
);

UrlParameter.Optional解决了不管参数是值类型还是引用类型,在未传对应参数的情况下,都会提供一个默认值(如0或者null)

这个时候再访问链接 http://localhost/Home/ShowAbout/arg1/arg2  ,则会出现如下结果,而不会报错

"arg1,arg2,"

当我们传入http://localhost/Home/ShowAbout/arg1//arg3,也就是故意不传arg2的值的时候,会发现结果是

"arg1,arg3,"

也就是arg3实际传给了参数arg2的位置,两个//还是三个///都会被忽略成一个 /

当我们访问 http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的链接时候,发现结果是:

"11,2,333"

即当Action方法的参数是Binding类型的时候, MVC框架会将路由参数优先于查询字符串值

ASP.NET MVC 自定义路由中几个需要注意的小细节的更多相关文章

  1. ASP.NET MVC自定义路由 - 实现IRouteConstraint限制控制器名(转载)

    自定义约束前 namespace MvcApplication2 { public class RouteConfig { public static void RegisterRoutes(Rout ...

  2. Asp.net MVC 自定义路由在IIS7以上,提示Page Not Found 解决方法

    受限确保自定义路由在开发服务器上Ok! 然后在web.config的<webserver>节点下增加如下配置就好了.   1: <system.webServer> 2: &l ...

  3. Asp.net MVC 自定义路由

    在做公司接口的时候  由于规范API 要用点分割. 如: HealthWay.controller.action 在MVC 4 下面做了个 路由配置如下: public override void R ...

  4. 7.ASP.NET MVC 5.0中的Routing【路由】

    大家好,这一篇向大家介绍ASP.NET MVC路由机制.[PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers[HTML帮助类] ] 路由是一个模式匹配系统,它确保 ...

  5. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  6. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

    原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...

  7. MVC自定义路由02-实现IRouteConstraint限制控制器名

    通过实现IRouteConstraint接口,实现对某个控制名进行限制.本篇把重点放在自定义约束,其余部分参考: MVC自定义路由01-为什么需要自定义路由    自定义约束前 using Syste ...

  8. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  9. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

随机推荐

  1. [ASE][Daily Scrum]11.17

    这两天感冒了没有第一时间更新blog和tfs,给大家抱歉了! 上周五我们已经将服务器搭建完成并成功通讯,周六周日大家非常给力的完成了很多内容! View Shilin Liu 处理来自服务器的数据 显 ...

  2. SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计 ...

  3. [C#] 與Android共舞–手機post資料給Server (转帖)

    最近在搞安卓,跟Server溝通是一定要的,這範例很簡單,就是我在Android 上面,透過POST 的方式傳資料給 Server ,則Server 收到值後直接回傳, Server side 是用a ...

  4. (转)基于OWIN WebAPI 使用OAuth授权服务【客户端模式(Client Credentials Grant)】

    适应范围 采用Client Credentials方式,即应用公钥.密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open ...

  5. 用Nifi合并二个API、计算并生成新的API

    1. 全景图   2. 合并 根据attribute合并flowfile:   合并 json, 并增加code,message等:   3. 计算方差: 在ExecuteScript里只能用纯pyt ...

  6. 微软BI 之SSIS 系列 - 再谈Lookup 缓存

    开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...

  7. JsRender for object 语法说明

    JsRender 作为一款JavaScript模版引擎,必不可少的会有循环功能,也就是for,但由于JsRender过于灵活,for竟然可以接受object作为循环对象. {{for Array}}和 ...

  8. 有关HTML5 Video对象的ontimeupdate事件的问题

    日前在做一个视频播放的页面,其中用到了HTML5的Video对象,这个是HTML5中新增的一个对象,支持多种不同格式的视频在线播放,功能比较强大,而且还扩展了许多事件,可以通过JavaScript脚本 ...

  9. C#与数据库访问技术总结(九)之实例

    实例 更新记录 在本例子中,建立一个供用户输入学生学号和姓名的文本框和几个对应不同操作类型的更新信息按钮,当用户输入信息以后单击相应的按钮则执行相应的操作.在此实例中还将接触到服务器信息验证的相关知识 ...

  10. SSDB安装配置

    1.下载ssdb wget -O ssdb-master.zip https://codeload.github.com/ideawu/ssdb/zip/master 2.编译安装 unzip ssd ...