2010-02-01 90 views
16

如何動態地創建URL /像鏈接: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132如何添加頁面標題中的網址在asp.net mvc的? (URL生成)

哪些關鍵字我可以用谷歌關於這個話題的一些文章? (如何在asp.net mvc中進行基因處理和處理這類網址)

還有一些問題: 如何生成鏈接? (存儲蛞蝓分貝?) 重定向或不如果蛞蝓是不規範的?

編輯:顯然,他們被稱爲蛞蝓

做到這一點

回答

2

一種方法是在你的字符串以下

string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 

現在你可以通過cleanString(標題,名稱等)到ActoinLink/Url.Action參數,它會工作得很好。

模式從http://snipplr.com/view/18414/string-to-clean-url-generator/

採取我不是100%的正則表達式,如果一些正則表達式英雄可以附和,並提供一個更好的將是巨大的。從測試的正則表達式,它不匹配的空間,但由於第一線替換所有空間用連字符這不應該是一個問題。

更新:

若要使用此代碼,你需要設置你的路由接受額外的參數。

我們將使用一個博客文章標題作爲一個例子。

 routes.MapRoute(
      "",            // Route name 
      "View/{ID}/{Title}",       // URL with parameters 
      new { controller = "Articles", action = "View"} // Parameter defaults 
     ); 

在你的ASP.NET MVC的意見,然後你可以做到以下幾點:

<%= Html.ActionLink("View Article", "View", "Articles", new { ID = article.ID, Title = Html.SanitizeTitle(article.Title) }, null) %> 

在前面的例子中,我使用SanitizeTitleHTML helper

public static SanitizeTitle(this HtmlHelper html, string str) 
{ 
    string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
    cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 
    return cleanString; 
} 
+0

我不是正則表達式替換英雄的所有非單詞字符但我認爲這會更好: input = Regex.Replace(input,@「[| \\ /]」,「 - 」); //用「 - 」代替「打破」字符 input = Regex.Replace(input,@「[^ a-zA-Z0-9 -_。〜]」,「」); //替換剩餘的非安全(RFC3986)字符與「」 input = input.Trim(new [] {' - ','_','。','〜'})。ToLower(); //修剪前導或尾隨非字母數字字符並轉換爲小寫 – JohannesH 2010-02-01 06:27:00

+1

廢話...註釋中沒有換行符。 – JohannesH 2010-02-01 06:28:51

6

您必須使用如下所示的內容。

Routes.MapRoute(
    "Post", 
    "posts/{id}/{*title}", 
    new { controller = "Posts", action = "view" } 
); 

和簡單的擴展方法:

public static class UrlExtensions 
{ 

    public static string ResolveSubjectForUrl(this HtmlHelper source, string subject) 
    { 
     return Regex.Replace(Regex.Replace(subject, "[^\\w]", "-"), "[-]{2,}", "-"); 
    } 

} 
+0

「{* title}」中的「*」是什麼? – Ante 2010-02-01 05:56:40

+0

這是一個全面的參數。 id後的所有內容都是標題。此外,這也使最後一個參數可選。 – 2010-02-01 06:06:22

+1

何時何地調用UrlExtensions.ResolveSubjectForUrl方法? – Chris 2011-05-21 04:00:09

2

我只是一個relevant question問今天的SO關於向段塞發生,又名/ slugify標題。

當使用slug獲取URL時,可以創建一個採取ID(和其他必需參數)和slug的操作,並簡單地忽略該slug。

public ActionResult Foobar(int id, string slug) 
{ 
    //-- Do Something 
} 

或者更優雅,使用地圖路線忽略試運行字符串您的網址後面,映射到Foobar(int id)

4

我一直保存在數據庫中蛞蝓靠任何實體將被它們引用。因此,對於博客文章,你就必須在「上崗」表中的「鼻涕蟲」字段。

要在ASP.Net MVC中處理它很簡單 - 你只需要使用一個常規路線來捕獲參數中的slu((甚至可能只是使用{id}),然後你的控制器會在數據庫,加載實體,並正常顯示。

儘管你可以使用一個簡單的RegEx來代替空格和不會產生你的slu,,但事實上這很快就會崩潰。您需要考慮可能出現在標題中的各種字符。邁克爾卡普蘭的博客與這個確切目的有很大關係; he's shared a function將從字符串中去除變音標記。

所以,你的「生成彈頭」的算法一般應採取以下形式:

  1. 修剪的領導串/尾隨空白使用邁克爾·卡普蘭的功能或同等
  2. 地帶注音符號
  3. 小寫字符串規範化
  4. 破折號
+0

爲什麼要將它們存儲在數據庫中? – 2013-08-20 14:06:56

+0

爲什麼?你不必這樣做。一般來說,我認爲這是更優化的。例如,如果你想編輯特定的slug/url,該怎麼辦。我不知道也許它會縮短或不管。如果不更改標題欄,您將無法做到這一點。是否有意義? – Victor 2017-04-23 01:41:50

相關問題