尝试使用自定义路由。这比此处提供的替代方案更灵活。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web;
using System.Web.Mvc;
public class ProductRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
string virutalPath = httpContext.Request.Url.AbsolutePath.Substring(1).ToLowerInvariant();
var productId = Product.GetProductIdFromVirtualPath(virutalPath);
if (productId != Guid.Empty)
{
result = new RouteData(this, new MvcRouteHandler());
result.Values["controller"] = "Product";
result.Values["action"] = "Details";
result.Values["id"] = productId;
}
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
VirtualPathData result = null;
string controller = Convert.ToString(values["controller"]);
string action = Convert.ToString(values["action"]);
if (controller == "Product")
{
string path = string.Empty;
if (action == "Details")
{
Guid productId = (Guid)values["id"];
var virtualPath = Product.GetVirtualPathFromProductId(productId);
}
if (!String.IsNullOrEmpty(virtualPath))
{
result = new VirtualPathData(this, virtualPath);
}
}
return result;
}
}
您可以通过将其直接添加到Global.asax中的路由表中来使用该路由,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"home",
"",
new { controller = "Home", action = "Index" }
);
routes.Add(new ProductRoute());
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
然后在您的本地化产品表上,只需有一个包含要查找路径的字段(不带前导斜杠)。当然,您没有提及如何存储数据,因此您需要自己想出来。
此外,您需要通过解析virtualPath来处理本地化。根据Google的说法,它应该存在。您应该根据传递的标头处理初始Culture,并重定向(302)到所选Culture的URL。然后用户应该能够切换语言,在这种情况下,您可以将其放入cookie中以便记住其偏好设置。但是,搜索引擎应该能够从URL中识别Culture而无需传递任何标头。
这将通过GetVirtualPath()方法处理@Html.RenderAction()的情况,如果需要,您可以更改逻辑。我建议您添加缓存,因为这将使每个请求都直接打到数据库中。路由表在应用程序启动时填充,但每个路由都会在每个请求上执行。
还有一件事 - 要处理“路由不匹配”场景,只需返回null,路由器就会继续移动到下一个配置的路由。这样可以配置尽可能多的自定义路由而不混淆逻辑。