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

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

    image   

    我发现 从 .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”或它的某一个依赖项。系统找不到指定的文件。

    image

    解决方法,在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}
    image

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

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

      image

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

    image

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

    image

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

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

    image

    好,我们接着来。当我昨天并没有想起来这是一个 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文件夹里面

    image 

    image

    image image

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

    image

    完整的代码如下

    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 他也是可以在浏览器 显示的  
        }
    
    }
    

    image   最后 记得给 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 的数据和行为。对象可以表示多个类型的能力称为多态性

  • 相关阅读:
    Matlab图像处理函数:regionprops
    Java的 volatile关键字的底层实现原理
    SQL学习(一.索引)
    solr7.7.0搜索引擎使用(四)(搜索语法)
    solr7.7.0搜索引擎使用(三)(添加文件索引)
    singleton单例模式小结
    多态小结
    quartz定时任务时间设置
    EditPlus编译运行java文件
    NoClassDefFoundError错误发生的原因
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2406543.html
Copyright © 2011-2022 走看看