回答

4

,我之前已經處理這個問題的方法是有兩條路線,順序

routes.MapRoute(
    null, 
    "questions/{id}/{title}", 
    new { controller = "Questions", action = "Index" }, 
    new { id = @"\d+", title = @"[\w\-]*" }); 

routes.MapRoute(
    null, 
    "questions/{id}", 
    new { controller = "Questions", action = "Index" }, 
    new { id = @"\d+" }); 
現在

在控制器動作註冊,

public class QuestionsController 
{ 
    private readonly IQuestionRepository _questionRepo; 

    public QuestionsController(IQuestionRepository questionRepo) 
    { 
     _questionRepo = questionRepo; 
    } 

    public ActionResult Index(int id, string title) 
    { 
     var question = _questionRepo.Get(id); 

     if (string.IsNullOrWhiteSpace(title) || title != question.Title.ToSlug()) 
     { 
      return RedirectToAction("Index", new { id, title = question.Title.ToSlug() }).AsMovedPermanently(); 
     } 

     return View(question); 
    } 
} 

我們將永久重定向到如果我們只有id,則包含標題slug(帶連字符的小寫字母作爲分隔符)的URL。我們還通過檢查問題標題的段落版本來確保傳遞的標題是正確的,從而爲包含標識和正確標題段落的問題創建規範URL。

一對夫婦的助手使用

public static class PermanentRedirectionExtensions 
{ 
    public static PermanentRedirectToRouteResult AsMovedPermanently 
     (this RedirectToRouteResult redirection) 
    { 
     return new PermanentRedirectToRouteResult(redirection); 
    } 
} 

public class PermanentRedirectToRouteResult : ActionResult 
{ 
    public RedirectToRouteResult Redirection { get; private set; } 
    public PermanentRedirectToRouteResult(RedirectToRouteResult redirection) 
    { 
     this.Redirection = redirection; 
    } 
    public override void ExecuteResult(ControllerContext context) 
    { 
     // After setting up a normal redirection, switch it to a 301 
     Redirection.ExecuteResult(context); 
     context.HttpContext.Response.StatusCode = 301; 
     context.HttpContext.Response.Status = "301 Moved Permanently"; 
    } 
} 

public static class StringExtensions 
{ 
    private static readonly Encoding Encoding = Encoding.GetEncoding("Cyrillic"); 

    public static string RemoveAccent(this string value) 
    { 
     byte[] bytes = Encoding.GetBytes(value); 
     return Encoding.ASCII.GetString(bytes); 
    } 

    public static string ToSlug(this string value) 
    { 
     if (string.IsNullOrWhiteSpace(value)) 
     { 
      return string.Empty; 
     } 

     var str = value.RemoveAccent().ToLowerInvariant(); 

     str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); 

     str = Regex.Replace(str, @"\s+", " ").Trim(); 

     str = str.Substring(0, str.Length <= 200 ? str.Length : 200).Trim(); 

     str = Regex.Replace(str, @"\s", "-"); 

     str = Regex.Replace(str, @"-+", "-"); 

     return str; 
    } 
}