[英]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>
你們都明白了嗎?
那么,有人有任何想法嗎?
提前致謝。
我之前做過這個。 當我挖掘代碼時,需要考慮以下事項:
更新 :這是我的代碼。 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.