C# ASP.NET产品网站的路由规则
我正在使用.NET Framework 3.5 SP1为ASP.NET下的客户网站构建产品目录。每个产品都有一个零件号和一个OEM零件号(都是全球唯一的) 出于搜索引擎优化的目的,我希望OEM零件号尽可能接近实际域名 如何构建允许我执行此操作的路由规则:C# ASP.NET产品网站的路由规则,c#,.net,asp.net,.net-3.5,seo,C#,.net,Asp.net,.net 3.5,Seo,我正在使用.NET Framework 3.5 SP1为ASP.NET下的客户网站构建产品目录。每个产品都有一个零件号和一个OEM零件号(都是全球唯一的) 出于搜索引擎优化的目的,我希望OEM零件号尽可能接近实际域名 如何构建允许我执行此操作的路由规则: http://www.myDomain.com/oemPartNumber http://www.myDomain.com/myPartNumber http://www.myDomain.com/welcome http://www.myD
http://www.myDomain.com/oemPartNumber
http://www.myDomain.com/myPartNumber
http://www.myDomain.com/welcome
http://www.myDomain.com/products
http://www.myDomain.com/services
http://www.myDomain.com/contact
在仍然能够做到这一点的同时:
http://www.myDomain.com/oemPartNumber
http://www.myDomain.com/myPartNumber
http://www.myDomain.com/welcome
http://www.myDomain.com/products
http://www.myDomain.com/services
http://www.myDomain.com/contact
如果你有任何建议,我也很想听听你的其他SEO建议(我们主要对谷歌感兴趣)
谢谢
重要提示:这不是一个MVC站点,因此我没有控制器。如果零件号有特定格式,您可以在路线上使用正则表达式约束,如下所示:
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
像“welcome”这样的文本与正则表达式不匹配,因此将忽略此路由。您应该能够指定像and这样的内容。url中必须有允许您选择要使用的控制器的内容,并且还允许您区分零件号和oem零件号(除非它们彼此之间也是唯一的。如果oem和pn之间永远不会重叠,那么您可以使用{partnumber}/pn)
RouteTable.Routes.Add(new Route
{
Url = "[query]/pn",
Defaults = new { controller="PartNumber", action = "Details" },
RouteHandler = typeof(MvcRouteHanderl)
});
你可以用一些诡计来对付这样的路线:
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
routes.MapRoute(
"Part number",
"{partNumber}",
new { controller = "Part", action = "Display" },
new
{
partNumber = @"\d+" // part number must be numeric
}
);
但这里的问题是,一个OEM零件号实际上不是零件号(如“ave-345”)将不匹配
更新:在阅读中,我注意到你说“这不是MVC站点,所以我没有控制器!”…哦!这会改变一切。在这种情况下,您可以检查传入的目录是否存在,如果不存在,您可以测试它的产品编号。但这必须在HttpModule中完成,以便在执行页面之前捕获它。然后在服务器端,您可以将页面定向到
看看这里,了解一下:
为此,您将拥有一个从IHttpModule继承的类。然后您可以指定一个Init方法
public void Init(HttpApplication application)
{
//let's register our event handler
application.PostResolveRequestCache +=
(new EventHandler(this.Application_OnAfterProcess));
}
这就指向了您的应用程序的后处理方法:
私有void应用程序\u OnAfterProcess(对象源、事件参数e)
在这里,你可以指定一些关于你要找什么的规则
我通常是按照
if (!System.IO.File.Exists(application.Request.PhysicalPath)) //doesn't exist
{
//you test for your product ID here
...
//if you find it stuff it into a ProductID variable for later...
隔离产品ID后,您可以重写URL(服务器端),并将用户引导到正确的productDetails.aspx页面
context.RewritePath("~/products/productDetails.aspx?ProductID=" + ProductID.ToString());
因此,当用户和谷歌看到你的应用程序时,你会看到,你可以像往常一样对它进行编码
我希望这就是你想要的!我知道你已经接受了答案,但让我发布一个更简单的新答案 这不是一个MVC站点,所以我没有 控制器 如果您使用Web表单,这是为您准备的:
基本上,您必须创建自己的
IRouteHandler
并设置到它的路由。然后,您可以使用它将任意多个URL映射到Web表单。这样可以避免使用旧的URL重写方法和此类肮脏的伎俩。(该博客条目上的下载链接不再起作用,但这对IMElement来说非常简单。无论如何,如果您需要一个工作示例,我可以为您提供一个。)这不是一个MVC站点,所以我没有控制器。但是您可以在没有MVC的情况下使用路由机制和路由约束。这不是一个MVC站点,所以我没有控制器。请看我的更新!它解决了对具有aspx和HttpModules的非MVC站点的相同需求。您需要在t接受请求,并在服务器端将其从mydomain.com/123456转换为mydomain.com/products/productdetails.aspx?pid=123456。+1这看起来非常有用。它看起来不像我想象的那样,所以我很高兴我问了这个问题。谢谢,我会让你知道它是怎么回事!