何よあなたが話しているのはスラグです。 URLの一部を構成する一意の文字列値を保持するには、ブログクラスにプロパティを追加するだけです。たとえば、次のようにブログを作成する際に
[Index]
[StringLength(80)]
public string Slug { get; set; }
はその後、あなたが手動(そのフォームのフィールドにする)やブログか何かの「slugifying」のタイトルで、それを構成するSlug
の値を指定します。たとえば、あなたが何か行うことができ、その後
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のparamを使用しますがそれによるブログ:Slug
プロパティは上記[Index]
が飾られている理由
public ActionResult GetBlog(string slug)
{
var blog = db.Blogs.SingleOrDefault(m => m.Slug == slug);
です。これにより、EFは列を作成し、列を追加するときに列の索引を作成します。クエリを行う列は、パフォーマンスの理由からインデックスを作成する必要があります。また、NVARCHAR(MAX)(文字列のデフォルトの列型)は索引付けできないため、列のセット長を定義する必要があります。
コメントありがとうございます! –