2009-07-18 59 views
1

我正在ASP.NET下使用.NET Framework 3.5 SP1构建客户网站的产品目录。每个产品都有一个零件号和一个OEM零件号(全部是全球唯一的)。ASP.NET产品的路由规则网站

对于搜索引擎优化的目的,我希望OEM零件号尽可能接近实际的域名。

如何建立一个路由规则,允许我做这件事:

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 

我也很想听听你的其他搜索引擎优化的建议(如果您有任何问题,我们主要对Google感兴趣)。

谢谢。

重要提示:这不是一个MVC网站,所以我没有控制器。

回答

1

你应该能够指定类似http://www.mydomain.com/oempartnumber/oemhttp://www.mydomain.com/mypartnumber/pn。网址中必须有一些东西可以让你选择你想要使用的控制器,并进一步允许你区分一个零件号码和一个OEM零件号码(除非它们也是唯一的,如果不会有重叠的话) OEM之间的pn然后你可以有http://www.mydomain.com/ {部分号码}/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 
    } 
); 

但这里的问题是,一个OEM部件号这实际上并不是一个零件号(例如“ave-345”)不会匹配!

更新:在阅读中我注意到你说“这不是一个MVC站点,所以我没有控制器!”......哦!这改变了事情。在这种情况下,您可以检查目录是否存在于您通过http://www.mydomain.com/1234的地方,如果不存在,您可以测试产品编号。这将不得不在HttpModule中完成,尽管您可以在执行页面之前捕获它。然后在服务器端,您可以将页面指向http://www.domain.com/productdetails?pid=1234

看看这里要明白:http://www.15seconds.com/Issue/020417.htm

为此,您将不得不从IHttpModule的继承的类。然后,你可以指定一个初始化方法

public void Init(HttpApplication application) 
{ 
    //let's register our event handler 
    application.PostResolveRequestCache += 
     (new EventHandler(this.Application_OnAfterProcess)); 
} 

这则指向您的Applicaton_OnAfterProcess方法:

私人无效Application_OnAfterProcess(对象源,EventArgs的)

{ 
    HttpApplication application = (HttpApplication)source; 
    HttpContext context = application.Context; 

    ... 

内的在这里你可以指定一些关于你在找什么的规则。

我通常做沿着

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

因此,尽管用户和谷歌公司http://www.mydomain.com/1234您的应用程序将会看到http://www.mydomain.com/products/productdetails.aspx?productid=1234,您可以针对它编写像往常一样。

我希望这是你正在寻找的东西!

1

如果有特定格式的部件号,你可以像这样的路线上使用正则表达式的约束:

routes.MapRoute(
    "Part number", 
    "{partNumber}", 
    new { controller = "Part", action = "Display" }, 
    new 
    { 
     partNumber = @"\d+" // part number must be numeric 
    } 
); 

文本,如“欢迎”将不匹配正则表达式,因此会忽略这条路线。

+0

这不是一个MVC网站,所以我没有控制器。 – 2009-07-18 19:07:09

+0

但是,您可以在不使用MVC的情况下将路由机制与路由约束一起使用http://www.codeproject.com/KB/aspnet/url_rewriting_routing.aspx – 2009-07-18 19:36:56

1

我看到你已经接受了一个答案,但让我发布一个更简单的新答案。

这不是MVC网站,所以我没有 控制器。

如果使用Web窗体,这是你Using Routing with Web Forms

基本上,你必须创建自己的IRouteHandler和设置您的路线吧。然后,您可以使用它来根据需要映射尽可能多的URL到您的Web窗体。这可以避免旧的URL重写方法和这种肮脏的技巧。 (该博客条目的下载链接不再适用,但这对于实体来说非常简单,无论如何,如果你需要一个工作示例,我可以为你提供一个。)