asp.net mvc 中 一種簡單的 URL 重寫

来源:http://www.cnblogs.com/ben121011/archive/2016/11/20/6082650.html
-Advertisement-
Play Games

asp.net mvc 中 一種簡單的 URL 重寫 Intro 在項目中想增加一個公告的功能,但是又不想直接用預設帶的那種路由,感覺好low逼,想弄成那種偽靜態化的路由 (別問我為什麼不直接靜態化,當時就是只想做成偽靜態化以後可能會做成完全靜態化),至於為什麼做偽靜態化或靜態化可以自行百度或參考本 ...


asp.net mvc 中 一種簡單的 URL 重寫

Intro

在項目中想增加一個公告的功能,但是又不想直接用預設帶的那種路由,感覺好low逼,想弄成那種偽靜態化的路由 (別問我為什麼不直接靜態化,當時就是只想做成偽靜態化以後可能會做成完全靜態化),至於為什麼做偽靜態化或靜態化可以自行百度或參考本文最後 Q&A 部分。

How to do

Step0 註冊路由

在註冊預設路由前添加自己的重寫路由,如下所示的 “Notice routes” 所示,第一個參數是 路由名稱,請保持在整個Web應用中唯一,第二個參數是 url,提供一個你想要重寫的 url 模板,模板參數放在 “{” 和 “}”之間, 第三個參數是設置是重寫指向的 controller 和 action(有時只指定 controller,看重寫需求),namespace指定需要處理的 controller 所在命名空間,當只有一個區域時可以不寫,多個區域的時候最好顯式指定對應的命名空間,防止路由衝突。

【註:新增的路由必須放在預設路由前面,不然不會有效果】

 1     public static void RegisterRoutes(RouteCollection routes)
 2     {
 3         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4         //notice route
 5         routes.MapRoute("Notice", "Notice/{path}", new { controller = "Home", action = "NoticeDetails" }, namespaces: new string[] { "ActivityReservation.Controllers" });
 6         //default route
 7         routes.MapRoute(
 8             name: "Default",
 9             url: "{controller}/{action}/{id}",
10             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
11             namespaces: new string[] { "ActivityReservation.Controllers" },
12             constraints:new { id = @"\d*"}
13         );
14     }

 

Step1 編寫控制器處理代碼

在上一步註冊路由的過程中,我們指定了處理的 controller(和 action ),接下來就需要在 controller 中處理請求了。

controller 中處理代碼示例如下:

 1         /// <summary>
 2         /// 公告詳情
 3         /// </summary>
 4         /// <param name="path">訪問路徑</param>
 5         /// <returns></returns>
 6         public ActionResult NoticeDetails(string path)
 7         {
 8             if (String.IsNullOrEmpty(path))
 9             {
10                 return RedirectToAction("Notice");
11             }
12             try
13             {
14                 var notice = new Business.BLLNotice().GetOne(n => n.NoticePath == path);
15                 if (notice != null)
16                 {
17                     return View(notice);
18                 }
19                 else
20                 {
21                     return RedirectToAction("Notice");
22                 }
23             }
24             catch (Exception ex)
25             {
26                 logger.Error(ex);
27                 throw;
28             }
29         }

 

在定義路由的時候,定義了一個模板參數“path”,在處理的 action 中直接作為方法的參數處理就可以嘍

Step2 調試代碼,看重寫效果

如果可以出現如下圖所示的頁面,那麼恭喜你,今天的 url 重寫完成了。

Q&A

Q:為什麼我們要做(偽)靜態化?

A:站點下的 *.html 文件有利於網站的 SEO 優化,有利於百度和google爬蟲爬你的網站,SEO做的好有利於提高搜索排名【SEO的水也很深、感興趣的可以自己找資料研究】。

Q:什麼是偽靜態化?什麼是完全靜態化?他們的區別是什麼?

A:偽靜態化是針對完全靜態化來說的,(完全)靜態化是會實際保存內容到一個 *.html 文件中,而偽靜態化則是通過伺服器端技術通過匹配 url 符合一定的模式就重新交給指定的程式處理並返回內容。

簡單來說,(完全)靜態化會有一個實際存在的靜態文件,偽靜態化則不存在,需要較多伺服器端的處理。

Q:偽靜態化和完全靜態化哪個好?

A:這個問題更好的問法應該是這樣的:“什麼時候適合用偽靜態化?什麼時候適合用完全靜態化?”,一個事物既然存在就必然有它存在的道理,如果沒有存在的意義必將死去。

完全靜態化一般會根據一個模板生成一個實際存在的 *.html 文件,完全靜態化不需要太多的伺服器端處理,客戶端請求這個文件時因為是一個靜態文件伺服器會直接將文件內容返回給客戶端,不需要額外的伺服器處理。
完全靜態化會減少伺服器的壓力。

偽靜態化伺服器上並沒有靜態 *.html文件,只是在伺服器斷使用了Rewrite,將動態URL進行重寫,使動態URL表現為靜態URL,以滿足網頁URL靜態需求但網頁依然為動態調用的,,是需要很多伺服器端處理的,比如url的模式匹配,從資料庫中查詢數據。

總結:雖然完全靜態化URL的網頁有打開速度快的優點,但是網站內容巨大的話,勢必會使網站的體積變大很多,網站遷移的話很麻煩,另一方面如果網站內容很多的時候修改模板的話,再次靜態化的時候會是一個很大的工作量。
     實際使用的話還是需要根據自己實際需要來選取。         

End

本文主要講解瞭如何簡單的做一個 mvc 中的 url 重寫,實現了一個通知公告的偽靜態化功能(以後可能會修改為完全靜態化)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題 如何控制 OData 路由 解決方案 為了註冊路由,可以使用 HttpConfigurationExtension 類中 MapODataServiceRoute 的擴展方法。對於單一路由這樣做足以,其餘的處理由實體數據模型來處理。 從 ASP.NET Web API 2.2 開始支持 ODa ...
  • 我們看看各個web框架的性能,以TPS為指標排序(每秒返回的response多的在前面,性能越好),所有測試都在Linux中運行。在對比中,我們看到ASP.NET Core取得優異的成績,具體6個回合的對比請移步TechEmpower查看 ...
  • 怎樣使用 async & await 一步步將同步代碼轉換為非同步編程 【博主】反骨仔 【出處】http://www.cnblogs.com/liqingwen/p/6079707.html 序 上次,博主通過《利用 async & await 的非同步編程》一文介紹了 async & await 的基 ...
  • 在工業領域也有極端的情況出現,早些年做通訊的時候,數據包頭、包尾、數據長度、數據校驗位都對,但是就是解析出來的數據不正確,這種情況不會經常出現,但是在某種特殊應用環境可能會頻繁出現,後來經過分析得出結論:可能是由於地質電磁干擾引起的。但是也有技術上的設計缺陷,例如:數據校驗位是累加和,改成CRC是不... ...
  • Visual Studio for Mac離線下載安裝。 環境:OS X EI Caption 10.11.2 .NET Core SDK 1.1 需預先安裝 .NET Core 1.1 SDK macOS版下載地址:https://go.microsoft.com/fwlink/?LinkID=8 ...
  • 前面幾篇重點都在講普通列表的相關操作,本篇主要講樹型列表的操作,詳情如下:... ...
  • 1、字母大小寫處理 2、字母與ASCII的互換 在Web開發時,ASCII的作用!(American Standard Code for Information Interchange,美國信息交換標準代碼) 舉個例子:' 單引號在sql語句中是個殺手,但是如果把(')它轉換成 "&#" + ASC ...
  • 利用 async & await 進行非同步 IO 操作 可以使用非同步函數訪問文件。使用非同步功能,可以調用非同步方法,而不使用回調或拆分您在多個方法或 lambda 表達式中的代碼。 若要使同步代碼非同步,則調用非同步方法而不是一個同步方法並添加幾個關鍵字到代碼中。 對文件操作使用非同步特性: 非同步特性有利於 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...