0

Я создаю сайт, который является блогом personel. Я хочу указать конкретную маршрутизацию, когда я вхожу в новый блог в панели администратора. Обычно, когда я его сохраняю, он совпадает с идентификатором базы данных. В любом случае у меня нет доступа к статической маршрутизации.Asp.Net Mvc Uniq Routing

Я хочу, чтобы параметр ссылки будет храниться в базе данных, когда блог вводимый через маршрутизацию

По умолчанию: локальный/ControlName/ActionName/ID (локальный/Блог/GetBlogs/2)

бушель Я хочу, чтобы

Требуются: локальный/ControlName/ActionName/storedValue (локальный/Блог/GetBlog/Bluesky) или локальный/storedValue (локальный/Bluesky)

ответ

0

что йо Вы говорите, это пуля. Вам просто нужно добавить свойство класса вашего блога, чтобы сохранить уникальное строковое значение, которое будет составлять часть URL-адреса. Например:

[Index] 
[StringLength(80)] 
public string Slug { get; set; } 

Затем, при создании блога, вы либо вручную указать значение для Slug (сделать это поле в форме) или составить его «slugifying» в названии блога или что-то. Я использую следующие строки расширения:

public static string RemoveDiacritics(this string s) 
{ 
    s = s ?? string.Empty; 
    if (s.Length > 0) 
    { 
     char[] chars = new char[s.Length]; 
     int charIndex = 0; 

     s = s.Normalize(NormalizationForm.FormD); 
     for (int i = 0; i < s.Length; i++) 
     { 
      char c = s[i]; 
      if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
       chars[charIndex++] = c; 
     } 

     return new string(chars, 0, charIndex).Normalize(NormalizationForm.FormC); 
    } 

    return s; 
} 

public static string Slugify(this string s, int maxLength = 80) 
{ 
    s = s ?? string.Empty; 
    //First to lower case 
    s = s.ToLowerInvariant().RemoveDiacritics(); 
    //Replace spaces 
    s = Regex.Replace(s, @"\s", "-", RegexOptions.Compiled); 
    //Remove invalid chars 
    s = Regex.Replace(s, @"[^a-z0-9s\-_]", "", RegexOptions.Compiled); 
    //Trim dashes from end 
    s = s.Trim('-', '_'); 
    //Replace double occurences of - or _ 
    s = Regex.Replace(s, @"([\-_]){2,}", "$1", RegexOptions.Compiled); 

    while (s.Length > maxLength) 
    { 
     var pieces = s.Split('-'); 
     pieces = pieces.Take(pieces.Count() - 1).ToArray(); 
     s = string.Join("-", pieces); 
    } 

    return s; 
} 

Тогда, например, вы могли бы сделать что-то вроде:

blog.Slug = blog.Title.Slugify(); 

Однако создать пробку, вы затем использовать URL из параметров для поиска блог с тем, что:

public ActionResult GetBlog(string slug) 
{ 
    var blog = db.Blogs.SingleOrDefault(m => m.Slug == slug); 

поэтому свойство Slug украшен [Index] выше. Это заставляет EF создавать индекс для столбца, когда он создает таблицу/добавляет столбец. Любой столбец, который вы хотите запросить, должен быть проиндексирован по соображениям производительности. Кроме того, вы должны определить заданную длину для столбца, так как NVARCHAR (MAX) (тип столбца по умолчанию для строки) не может быть проиндексирован.

+0

Спасибо за замечание! –