<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ASP.NET MVC3的偽靜態實現

      最近使用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 class TestRoute:RouteBase
      {
      private string[] urls;
              public TestRoute(params string[]targetUrls) {
                  urls = targetUrls;
              }
      public override RouteData GetRouteData(HttpContextBase httpContext)
              {
                  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(thisnew MvcRouteHandler());
                      result.Values.Add("controller""Test");
                      result.Values.Add("action""Index");
                      result.Values.Add("p", requestedURL);
                  }
                  return result;
              }
      public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
              {
                  return null;
              }
      }

       上面例子中,我們根據判斷Url中是否符合某個特定的值來特定執行特定Controller和特定Action,沒有就返回null。

      第二步,在Global.aspx中注冊我們自己的路與規則:

       

      public static void RegisterRoutes(RouteCollection routes)
              {
                  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方法中加入如下代碼:

      routes.Add(new TestRoute("product"));

       注明:TestRoute 是上面我們自己定義的路由,實現RouteBase的類。

       第三步:新建第一步中測試用的Controller

       

      public class TestController: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 override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
              {
                  if (values["controller"].ToString().Contains("Test"))
                  {
                      return new VirtualPathData(this, "product/" + values["p"] + ".html");
                  }
                  else
                  return null;
              }
      

       可以替換第一步中TestRoute類中的GetVirtualPath方法,查看實際效果。

      posted @ 2011-12-20 12:34  wxj200589  閱讀(4760)  評論(7)    收藏  舉報
      主站蜘蛛池模板: 四虎国产精品永久在线国在线| 曰韩无码二三区中文字幕| 亚洲国产精品一区二区第一页| 亚洲AV无码破坏版在线观看| 国产一级二级三级毛片| 亚洲精品综合一区二区三区| 国产偷窥熟女精品视频大全| 成人午夜av在线播放| 国产精品成人网址在线观看| 欧美乱强伦xxxx孕妇| 日本久久99成人网站| 午夜福利你懂的在线观看| 中文字幕午夜福利片午夜福利片97| 久热这里只有精品12| 亚洲人成网站观看在线观看 | 亚洲中文字幕无码专区| 日韩加勒比一本无码精品| 中文字幕久久精品波多野结| 国产精品无码一区二区三区电影| 狠狠综合久久综合88亚洲| 国精品午夜福利不卡视频| 国产精品久久香蕉免费播放| 久久精品第九区免费观看| 中文字幕日韩一区二区不卡| 日韩AV高清在线看片| 国产精品一区二区不卡91| 精品国偷自产在线视频99| 玉环县| 国产在线精品一区二区三区不卡| 福利一区二区在线视频| 尖扎县| 成人亚欧欧美激情在线观看| 国产午夜91福利一区二区| 国产精品天堂蜜av在线播放| 91亚洲精品一区二区三区| 亚洲AV无码一二区三区在线播放| 女同在线观看亚洲国产精品| 中文字幕av一区二区| 永顺县| 国产超碰无码最新上传| 中文无码日韩欧免费视频|