2010-02-01 5 views
16

동적 URL을 만드는 방법/같은 링크 : www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132asp.net mvc에서 url에 페이지 제목을 추가하는 방법? (URL 생성)

무엇인가 키워드 나는이 화제에 google 몇몇 기사에 사용할 수 있는가? (genererate 및 asp.net mvc 내부에 이런 종류의 URL을 처리하는 방법)

몇 가지 질문이 있습니다 : 링크를 생성하는 방법? (db에 굼벵이를 저장 하시겠습니까?) 슬러그가 표준이 아닌 경우 리디렉션합니까?

편집 : 분명히 그들은이라고 슬러그

이 작업을 수행하는

답변

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 매개 변수를 사용하면 큰 효과를 볼 수 있습니다.

이 패턴은 몇 가지 정규식 영웅이 차임 및 좋은 것 더 나은 하나를 제공 할 수 있는지, 정규식 패턴에 100 %를 해요 http://snipplr.com/view/18414/string-to-clean-url-generator/

에서 가져온 것입니다. Regex 테스트에서 공백과 일치하지 않지만 첫 번째 줄은 모든 공백을 하이픈으로 바꾸기 때문에 문제가되지 않습니다.

업데이트 :

이 코드를 사용하려면, 당신은 추가 매개 변수를 허용하도록 설정에 경로를해야합니다.

블로그 기사 제목을 예로 사용합니다. 당신의 ASP.NET MVC 뷰에서

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

, 당신은 다음을 수행 할 수 있습니다

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

를 앞의 예에서, 나는 HTML helperSanitizeTitle를 사용합니다.

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, @ "[| \\ /]", "-"); // "깨는"문자를 "-"로 바꾸십시오. 입력 = Regex.Replace (입력, @ "[^ a-zA-Z0-9 -_. ~]", "")); // 나머지 안전하지 않은 (RFC3986) 문자를 " input = input.Trim (new [] { '-', '_', '.', '~'})로 바꿉니다. // 영숫자가 아닌 문자를 앞뒤로 자르고 소문자로 변환 – JohannesH

+1

쓰레기 ... 주석에 줄 바꿈이 없습니다. – JohannesH

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

+0

이것은 포괄적 인 매개 변수입니다. id 다음은 모두 title입니다. 또한 마지막 매개 변수도 선택적으로 만듭니다. –

+1

UrlExtensions.ResolveSubjectForUrl 메서드는 언제 어디에서 호출합니까? – Chris

2

난 그냥 SO 슬러그를 생성에 관한에 relevant question 오늘 질문, 일명/제목을 slugify.

슬러그로 URL을 가져 오는 경우 ID (및 기타 필수 인수)과 slug을 모두 받아들이고 단순히 슬러그를 무시하는 작업을 만들 수 있습니다.

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

또는 더 우아한는, 사용지도 경로는 URL 뒤에 문자열을 시운전 무시하고 Foobar(int id)에 매핑합니다.

4

저는 항상 데이터베이스에 slug를 저장했습니다. 그래서 블로그 게시물의 경우 "posts"테이블에 "slug"필드가 있습니다.

ASP.Net MVC에서 처리하려면 쉽습니다. 매개 변수에서 슬러그를 캡처하는 일반 경로 만 사용하면 (컨트롤러가 {id}를 사용하는 경우라도 가능) 컨트롤러가 슬러그를 엔티티를로드하고 정상적으로 표시하십시오.

간단한 RegEx를 사용하여 공백과 썸네일을 대체하여 슬러그를 생성 할 수 있지만 실제로는 꽤 빨리 분해됩니다. 제목에 나타날 수있는 모든 종류의 문자를 고려해야합니다. 마이클 카플란 (Michael Kaplan)의 블로그는이 정확한 목적을 위해 크게 연관되어 있습니다. he's shared a function 문자열에서 분음 기호를 제거합니다.

그래서, 당신의 "슬러그를 생성"알고리즘은 일반적으로의 형태로해야 : 공백을 마이클 카플란의 기능 또는 동등한를 사용하여

  • 스트립 구별 부호를 후행/트림 선두의 캐릭터를

    1. 소문자 정규화
    2. 에 대한 문자열은 내가 더 정규식 영웅 해요
  • +0

    왜 그들을 데이터베이스에 저장하겠습니까? –

    +0

    왜? 당신은 그렇게 할 필요가 없습니다. 일반적으로 나는 그것이 더 최적이라고 생각한다. 예를 들어 특정 슬러그/URL을 편집하려는 경우 나는 그것을 더 짧게 만들거나 무엇이든하는 것을 모른다. 당신은 제목 필드를 변경하지 않고는 그것을 할 수 없을 것입니다. 그것은 의미가 있습니까? – Victor

    관련 문제