gpt4 book ai didi

c# - 在 Razor (C#/MVC 4) 中生成 "friendly URL"的助手

转载 作者:太空狗 更新时间:2023-10-29 21:34:24 26 4
gpt4 key购买 nike

目标

在 Razor 中创建将字符串转换为友好字符串的东西(我使用的是 C#/MVC4)

问题

我有以下代码:

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

我的类别名称如下:CD、DVD 和 Bluray我想连接成“友好字符串”,例如 cds-dvds-and-blurays 使用像这样:

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

你们都看得懂吗?

那么,有人知道吗?

提前致谢。

最佳答案

我以前做过。在我挖掘代码时,需要注意以下事项:

  1. 确保存储生成的网址,以便进行碰撞检测;将字符串转换为友好的 URL 几乎肯定会有损失,因此您需要逻辑来解决冲突的名称。
  2. 您应该尝试将变音符号转换为更易于输入的字符。
  3. 考虑使网址到资源的映射成为一对多的关系;如果您的资源名称发生变化,您可能希望生成一个新的 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;
}

关于c# - 在 Razor (C#/MVC 4) 中生成 "friendly URL"的助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17092186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com