簡體   English   中英

Helper在Razor中生成“友好URL”(C#/ MVC 4)

[英]Helper to generate “friendly URL” in Razor (C#/MVC 4)

目標

創建一些在Razor中將字符串轉換為友好字符串的東西(我正在使用C#/ MVC4)

問題

我有以下代碼:

<li>
   <img 
    src="~/Images/Products/@Model["CategoryName"]/@Model["ProductThumbnailUrl"]"
   />
</li>

我的類別的名稱是: CDs, DVDs and Bluray ,我想連接像cds-dvds-and-blurays這樣的“友好字符串”:

<li>
   <img 
    src="~/Images/Products
          /@HtmlHelper.ConvertToFriendlyString(@Model["CategoryName"])
          /@Model["ProductThumbnailUrl"]"
   />
</li>

你們都明白了嗎?

那么,有人有任何想法嗎?

提前致謝。

我之前做過這個。 當我挖掘代碼時,需要考慮以下事項:

  1. 確保存儲生成的URL,以便進行碰撞檢測; 將字符串轉換為友好的URL幾乎肯定會有損,因此您需要邏輯來解決沖突的名稱。
  2. 你應該嘗試將變音符號轉換為更容易打字的字符。
  3. 考慮將url-to-resource映射設為1:多關系; 如果資源名稱發生更改,您可能希望生成新URL 並將舊URL重定向到新URL。

更新 :這是我的代碼。 Stack Overflow方法沒問題,但我更喜歡我的方法; 而不是使用一組字符替換,它使用偉大的.NET Unicode庫來創建更友好的字符:

public static string ConvertToFriendlyUrl(string text)
{
    var decomposed = text.Normalize(NormalizationForm.FormKD);
    var builder = new StringBuilder();
    foreach (var ch in decomposed)
    {
        var charInfo = CharUnicodeInfo.GetUnicodeCategory(ch);
        switch (charInfo)
        {
            // Keep these as they are
            case UnicodeCategory.DecimalDigitNumber:
            case UnicodeCategory.LetterNumber:
            case UnicodeCategory.LowercaseLetter:
            case UnicodeCategory.CurrencySymbol:
            case UnicodeCategory.OtherLetter:
            case UnicodeCategory.OtherNumber:
                builder.Append(ch);
                break;

            // Convert these to dashes
            case UnicodeCategory.DashPunctuation:
            case UnicodeCategory.MathSymbol:
            case UnicodeCategory.ModifierSymbol:
            case UnicodeCategory.OtherPunctuation:
            case UnicodeCategory.OtherSymbol:
            case UnicodeCategory.SpaceSeparator:
                builder.Append('-');
                break;

            // Convert to lower-case
            case UnicodeCategory.TitlecaseLetter:
            case UnicodeCategory.UppercaseLetter:
                builder.Append(char.ToLowerInvariant(ch));
                break;

            // Ignore certain types of characters
            case UnicodeCategory.OpenPunctuation:
            case UnicodeCategory.ClosePunctuation:
            case UnicodeCategory.ConnectorPunctuation:
            case UnicodeCategory.Control:
            case UnicodeCategory.EnclosingMark:
            case UnicodeCategory.FinalQuotePunctuation:
            case UnicodeCategory.Format:
            case UnicodeCategory.InitialQuotePunctuation:
            case UnicodeCategory.LineSeparator:
            case UnicodeCategory.ModifierLetter:
            case UnicodeCategory.NonSpacingMark:
            case UnicodeCategory.OtherNotAssigned:
            case UnicodeCategory.ParagraphSeparator:
            case UnicodeCategory.PrivateUse:
            case UnicodeCategory.SpacingCombiningMark:
            case UnicodeCategory.Surrogate:
                break;
        }
    }

    var built = builder.ToString();
    while (built.Contains("--")) 
        built = built.Replace("--", "-");
    while (built.EndsWith("-"))
    {
        built = built.Substring(0, built.Length - 1);
    }
    while (built.StartsWith("-"))
    {
        built = built.Substring(1, built.Length - 1);
    }
    return built;
}

public static string GetIncrementedUrl(string url)
{
    var parts = url.Split('-');
    var lastPortion = parts.LastOrDefault();
    int numToInc;
    bool incExisting;
    if (lastPortion == null)
    {
        numToInc = 1;
        incExisting = false;
    }
    else
    {
        if (int.TryParse(lastPortion, out numToInc))
        {
            incExisting = true;
        }
        else
        {
            incExisting = false;
            numToInc = 1;
        }
    }

    var fragToKeep = incExisting 
        ? string.Join("-", parts.Take(parts.Length - 1).ToArray()) 
        : url;
    return fragToKeep + "-" + (numToInc + 1).ToString();
}

public static string SeekUrl(
    string name, Func<string, bool> uniquenessCheck)
{
    var urlName = UrlUtils.ConvertToFriendlyUrl(name);
    while (!uniquenessCheck(urlName))
    {
        urlName = UrlUtils.GetIncrementedUrl(urlName);
    }

    return urlName;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM