0

我正在使用 ASP.NET MVC 4 开发一个应用程序,我希望我的 URL 如下所示:

http://www.mysite.com/Product/Category/2/دربهای-چوبی

为此,我在以下位置使用这种 URL 模式Global.asax

routes.MapRoute(
                name:"ViewProduct",
                url:"Product/Category/{Id}/{productName}",
                defaults: new { controller = "Product", action = "Category", id = UrlParameter.Optional, productName = "" }
            );

在我看来,我正在使用这种方式生成我的 URL:

<a href="/Product/Category/@item.Id/@Url.ToFriendlyUrl(item.Name)">@item.Name</a>

如您所见,我正在创建名为的扩展方法ToFriendlyUrl

public static string ToFriendlyUrl(this UrlHelper helper,
            string urlToEncode)
        {
            urlToEncode = (urlToEncode ?? "").Trim().ToLower();

            StringBuilder url = new StringBuilder();

            foreach (char ch in urlToEncode)
            {
                switch (ch)
                {
                    case ' ':
                        url.Append('-');
                        break;
                    case '&':
                        url.Append("and");
                        break;
                    case '\'':
                        break;
                    default:
                        if ((ch >= '0' && ch <= '9') ||
                            (ch >= 'a' && ch <= 'z'))
                        {
                            url.Append(ch);
                        }
                        else
                        {
                            url.Append('-');
                        }
                        break;
                }
            }

            return url.ToString();
        }

上述方式适用于英文 URL(产品名称的段):

http://www.mysite.com/Product/Category/3/category-type-one

但是对于波斯语 URL,我得到了这个 URL,例如:

http://www.mysite.com/Product/Category/1/--------------

例如第二个应该是:

http://www.mysite.com/Product/Category/2/دربهای-چوبی

如何更改代码以使用波斯 URL?

PS:我知道在波斯语中我们没有大小写,我省略了这行代码:

urlToEncode = (urlToEncode ?? "").Trim().ToLower();

但我仍然有同样的问题。

谢谢

4

1 回答 1

2

这如果

                if ((ch >= '0' && ch <= '9') ||
                    (ch >= 'a' && ch <= 'z'))

表示只允许使用英文数字和字符。但波斯字符有不同的范围:

 public static bool ContainsFarsi(string txt)
        {
            return !string.IsNullOrEmpty(txt) &&
                    Regex.IsMatch(txt, @"[\u0600-\u06FF]");
        }

+ 不要使用那种ToFriendlyUrl方法。创建一个扩展方法来应用您的过滤,然后使用标准Html.ActionLink方法并传递您的参数,new route values或者最好使用 T4MVC HTML 辅助方法。通过手动构建链接,您将失去许多功能,例如根据当前域或子域调整根路径以及编码特殊字符和许多外部内置功能。

于 2013-09-28T14:12:46.530 回答