ASP.NET MVC和波斯友好的URL

时间:2013-09-28 13:04:44

标签: url asp.net-mvc-4 asp.net-mvc-routing url-routing persian

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

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

这样做我在Global.asax中使用这种网址格式:

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

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

<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();
        }

以上方式适用于英文网址(productName的细分):

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

但是对于波斯语网址我正在获取此网址,例如:

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

例如第二个应该是:

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

如何更改代码以使用波斯语网址?

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

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

但我仍然有同样的问题。

感谢

1 个答案:

答案 0 :(得分: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帮助程序方法。 通过手动构建链接,您将失去许多功能,例如根据当前域或子域调整根路径,以及编码特殊字符和许多外部内置功能。<​​/ p>