您的位置:首页 > 编程语言 > ASP

如何使用 asp.net 4.0 新特性 路由功能 有助于seo优化 给一个 asp.net web项目(网站项目) 增加路由功能 ,继承,给根据路由生成的url的结尾,增加一个有利于seo优化的斜杠 /,跳转到一个路由生成的url页面

2012-03-19 19:35 2016 查看
我们使用之前的 牛腩新闻发布系统(用的是 web 网站来开发的)来演示。由于之前的牛腩新闻发布系统是 .net 3.5的版本,所以我们要转换成 .net 4.0 版本。首先会提示升级,然后打开web层之后,分别添加 DAL层,BLL层,Model层到项目中,并引用。然后 分别每个层右键属性 选择框架为 .net 4.0.





我发现 从 .net 3.5 升级到 .net 4.0之后 。由于之前是开发环境是 vs2008. 在web.config 里面,配置了很多 水晶报表的东西,而我现在的开发环境是 windows server 2008 + vs2010,可能就没有vs2008的水晶报表了,所以一直在报错。解决方法就是在 web.config 里面 屏蔽掉水晶报表

附上报错的提示:

分析器错误消息: 未能加载文件或程序集“CrystalDecisions.CrystalReports.Engine, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304”或它的某一个依赖项。系统找不到指定的文件。

解决方法,在web.config 里面 屏蔽掉水晶报表(因为我的程序里面 压根没有用到过这个)
<!--<add assembly="CrystalDecisions.CrystalReports.Engine, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.ReportSource, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Shared, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Enterprise.Framework, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add assembly="CrystalDecisions.Enterprise.InfoStore, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>-->


我们打开新闻发布系统之后,将里面的点击查看文章的链接,

http://localhost:4035/Web/newscontent.aspx?newsid=132我们结合新闻分类 修改成 http://localhost:4035/web/news/{category}/{id}




下面开始步骤,以及 给 asp.net web项目( 网站项目) 增加 路由功能的艰难过程

1:在 web层里面 添加 Global.asax全局应用程序类。添加 路由的代码





但是我们发现,生成的代码 居然是这个样子的。





由于在这种页面下 无法引用 using System.Web.Routing;





但是当我点击右边的 解决方案管理器 右键进行 重新生成解决方案的时候,总是报错代码,说是缺乏对 System.Web.Route的引用。后面我才想起来,我这个原本就是

通过 新建网站-> 而生成的 asp.net 网站,只需要对其他的DAL层,BLL层进行编译,而Web层是不用编译的。 于是我直接运行首页,并没有报错。只有是通过 新建项目 ->而生成的 asp.net web应用程序才需要 重新生成解决方案





好,我们接着来。当我昨天并没有想起来这是一个 asp.net 网站的时候,我从是尝试用 asp.net web应用程序的 重新生成解决方案去生成,结果老是报错,于是我用了第二种方法,(实际上第二种方法,到最后我运行 到 重新生成解决方案的时候,也是一样报错的,归根结底就是 asp.net 网站 不用编译,直接运行,你再怎么 重新生成解决方案,也会报错的)

第二种方法 :我们还是新添加 Global.asax, 只留下第一行,并且修改成如下。

<%@ Application Language="C#"  CodeBehind="Global.asax.cs" Inherits="Global"%>


由于我们需要给Global.asax 增加一个后置代码,而由于这个后置代码很特殊,所以我们在Web层添加一个新的类,名字为 Global.asax.cs的时候,会提示保存到App_Code文件夹里面















注意,通过这样的方法新生成的 cs 里面是空的,我们需要 引用 路由的引用,还需要把 Global 类 继承自 System.Web.HttpApplication ,最后还需要添加 Application_Start 函数和 注册路由的函数。 global类与HttpApplication十分紧密,其事上,global类是继承与System.Web.HttpApplication类。





完整的代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing; //引用 路由

/// <summary>
///Global 的摘要说明
/// </summary>
public class Global:System.Web.HttpApplication//Global类是继承自 System.Web.HttpApplication 的
{
// public Global()
//{
// //
// //TODO: 在此处添加构造函数逻辑
// //
//}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}

private static void RegisterRoutes(RouteCollection routeCollection)
{
//定义默认值,我们把类别和id的默认值都定义为 *  后面我们去newscontent.aspx 里面去判断接收的值是否为 *
var defaults = new RouteValueDictionary{{"category","*"},{"id","*"}};

routeCollection.MapPageRoute("newsdesc", "newsdesc/{category}/{id}", "~/newscontent.aspx", true, defaults);

//这里的url定义挺好玩的,例如 假如你把 上面的改为 newsdesc/{category}/{id}.html  他就变成了 html显示了
//或者你改为 newsdesc/{category}/{id}.jsp  newsdesc/{category}/{id}.xxoo 他也是可以在浏览器 显示的
}

}



最后 记得给 web层 增加 System.Web.Routing

这样,我们现在访问 http://localhost:4035/Web/newsdesc/类别名称随便/122这样来访问页面了,当然了,我们要在刚才的 实际页面 newscontent.aspx做一点修改


二:如何在页面 接受传过来的值?也就是 怎么把url里面的值 提取出来

我们刚才已经把url地址 定义为 http://localhost:4035/Web/newsdesc/类别名称随便/122那么他对应的 category 是 “类别名称随便”,id是 “122”

如何获取这个122呢? 根据 RouteData.Values[你的占位符]来获取

string newsid = RouteData.Values["id"].ToString();


后续的就和我们平时运用的一样了,增删查改。


那么如果是在前台控件里面绑定呢?注意这里是用的 $ 符合来做的绑定

<asp:Literal ID="litId"  runat="server" Text='<%$RouteValue:id %>'></asp:Literal>

三:使用标记创建自动生成的 URL 简单的说,就是我们在第一步创建了 url 路由的规则,那么我们要想

从数据库读取了数据之后,通过<a href=’’>产品链接</a>怎么去匹配这个链接呢?而且当 路由规则改变后,这个链接也会自动的进行更改呢?

我们回到首页,看一下新闻详细页的链接方式是

<a href='newscontent.aspx?newsid=<%# Eval("id") %>'><%# StringTruncat( Eval("title").ToString(),15,"...") %></a>


这里,我们是写死的,那么如何根据 之前定义的 Url 规则,来改写这里的代码呢?而且,如果我们的规则修改了,这里的代码 ,也能否自动修改呢?

错误方法(1): <asp:HyperLink ID="HyperLink5" runat="server" NavigateUrl="<%$RouteUrl:category=11,id=122,routename=newsdesc%>">
<%#Eval("title")%></asp:HyperLink>生成的后的url 为 http://localhost:4035/Web/newsdesc/11/122 但是可惜,这种Url的id和category也是死的

错误方法(2):我们能不能修改上面的 id 和 category 为 Eval(“id”) 呢? 答案是否定的 不可以。

<asp:HyperLink ID="HyperLink5" runat="server" NavigateUrl='<%$RouteUrl:category=11,id=Eval("id"),routename=newsdesc%>'>
<%#Eval("title")%></asp:HyperLink>

生成后的url为 http://localhost:4035/Web/newsdesc/11/Eval(%22id%22)

正确方法(1): 使用 asp.net 内置的方法 GetRouteUrl ( 路由名称,{ 数据})

<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl='<%# GetRouteUrl("newsdesc", new {category = Eval("name")  ,id=Eval("id")}) %>' Text='<%# Eval("Title") %>'>
</asp:HyperLink>

正确方法(2) 网上看的,但是我感觉 如果是循环之类的 不好弄,麻烦··(实话实说是我没看懂,也不会用··)

我们在前台页面,写

<asp:HyperLink ID="HyperLink2" runat="server"><%# Eval("Title") %></asp:HyperLink>

接下来,在后台代码里面

using System.Web.Routing;

详情:http://msdn.microsoft.com/zh-cn/library/dd329551.aspx


三:其他的小技巧

(1):跳转到一个根据路由构建的 url。比如我们想直接跳转到一个虚拟页面 这个时候就不是用 Response.Redirect 了而是用
Response.RedirectToRoute("newsdesc", new {category="122",id="122"});
(2):给根据路由生成的url的结尾,增加一个有利于seo优化的斜杠 /
VirtualPathUtility.AppendTrailingSlash(string path)
例如:
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl='<%# VirtualPathUtility.AppendTrailingSlash(GetRouteUrl("newsdesc", new {category = Eval("name")  ,id=Eval("id")})) %>'
 Text='<%# Eval("Title") %>'></asp:HyperLink>

小知识:继承:

类可以从其他类中继承。这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。例如

  public class A
{
public A() { }
}

public class B : A
{
public B() { }
}

新类(即派生类)将获取基类的所有非私有数据和行为以及新类为自己定义的所有其他数据或行为。因此,新类具有两个有效类型:新类的类型和它继承的类的类型。
在上面的示例中,类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为。对象可以表示多个类型的能力称为多态性

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐