当前位置:网站首页>ASP.NET MVC3的伪静态实现
ASP.NET MVC3的伪静态实现
2022-08-03 05:23:00 【全局变量】
最近使用asp.net MVC3开发B2C电子商务系统,为了SEO的优化工作,需要通过路由实现伪静态URL,后续再根据需要生成真正的静态页面,不直接走路由访问具体的页面。现在开始研究第一步,如何定义自己的路由规则,达到伪静态的功能需求。
基本实现原理如下图:
首先,关于命名空间。
路由的功能是为了让所有Asp.net网站开发都可以使用,所以dll并没有在MVC中,而是在System.Web中的System.web.Routing。
现在我们为了我们实际的需求,实现MVC3中的自定义路由功能(继承RouteBase,重写RouteData和VirtualPathData)。
下面的例子实现以下目的:输入一个youdomin.com/product/123.html,执行TestController中Index.
第一步:实现TestRoute类
1 RouteData 每次访问URL都会从此入口
通过httpContext.Request.AppRelativeCurrentExecutionFilePath 获取我们访问的url地址,根据地址进行分析:是不是符合我们的规则,符合我们规则我们就走特定的Controller和Action。代码如下:
{
public TestRoute(params string[]targetUrls) {
urls = targetUrls;
}
{
RouteData result = null;
string requestedURL =
httpContext.Request.AppRelativeCurrentExecutionFilePath+httpContext.Request.PathInfo;
requestedURL = requestedURL.Substring( 2).Trim( '/');
if (requestedURL.Contains(urls.ToArray().GetValue( 0).ToString()))
{
result = new RouteData( this, new MvcRouteHandler());
result.Values.Add( "controller", "Test");
result.Values.Add( "action", "Index");
result.Values.Add( "p", requestedURL);
}
return result;
}
{
return null;
}
上面例子中,我们根据判断Url中是否符合某个特定的值来特定执行特定Controller和特定Action,没有就返回null。
第二步,在Global.aspx中注册我们自己的路与规则:
{
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}");
routes.Add(new TestRoute("product"));
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();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
注意上述代码红色部分,Application_Start() 中注册一个路由规则,RegisterRoutes(RouteTable.Routes)然后在RegisterRoutes方法中加入如下代码:
注明:TestRoute 是上面我们自己定义的路由,实现RouteBase的类。
第三步:新建第一步中测试用的Controller
{
public ActionResult Index( string p)
{
ViewData[ "t"] =p;
return View( "");
}
}
第四步:新建一个视图
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<!--此处会显示你输入的URL地址-->
@ViewData[ "t"].ToString()
</div>
</body>
</html>
第五步,直接输入URl测试
比如:http://127.0.0.1/product/1.html
后续补充:
主要内容:如何让前台列表展示页显示以上5步中实现的伪静态URL?
经过实际验证,发现RouteBase中VirtualPathData的实现就能解决以上问题。.net Route其实已经实现了这个双向解析的问题,通过输入URL,从RouteData进入,根据自己的路由规则进行解析到相对应的Controller和Action,然后在使用URL.Action的地方从VirtualPathData解析出符合路由规则的URL地址,具体代码如下:
public overrideVirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { if(values["controller"].ToString().Contains("Test")) { returnnewVirtualPathData(this, "product/"+ values["p"] + ".html"); } else returnnull; } |
可以替换第一步中TestRoute类中的GetVirtualPath方法,查看实际效果。
边栏推荐
猜你喜欢

Leetcode刷题——128. 最长连续序列

Delightful Nuxt3 Tutorial (1): Application Creation and Configuration

pta a.1030的dijkstra+DFS方法

Qlik Sense 判空详解(IsNull)

Qlik Sense 聚合函数及范围详解(Sum、Count、All、ToTaL、{1})

嵌入式实验二注意点

jsp通过form表单提交数据到servlet报404

Qlik Sense 赋值详解(Set、Let)

嵌入式实验四

TypeError: Cannot read property ‘xxxx‘ of undefined的解决方法
随机推荐
Mysql 预准备语句详解(prepare、execute、deallocate)
边缘辅助无人机网络的分层联邦学习
东南亚跨境电商
中国生物反应器行业发展现状及前景规划分析报告报告2022~2028年
Kettle 从资源库中载入新的转换出错(Invalid byte 1 of 1-byte UTF-8 sequence)
TypeError: Cannot read property ‘xxxx‘ of undefined的解决方法
中国生物降解塑料行业市场运营态势及发展趋势研究报告2022~2028年
【解读合约审计】Harmony的跨链桥是如何被盗一亿美金的?
【DC-2靶场渗透】
Qlik Sense 临时处理表数据详解(Resident)
3559. 围圈报数
uni-app 滚动到顶部/指定位置
中国认证认可服务行业“十四五”发展规划及经营模式分析报告2022~2028年
C语言简单实现扫雷小游戏
Execute the mysql script file in the docker mysql container and solve the garbled characters
嵌入式实验二
漫谈Map Reduce 参数优化
NFT租赁提案EIP-5006步入最后审核!让海外大型游戏的链改成为可能
[Rebound shell and privilege escalation]
Oracle 日历表详解(含节假日)