Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET产品网站的路由规则_C#_.net_Asp.net_.net 3.5_Seo - Fatal编程技术网

C# ASP.NET产品网站的路由规则

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

我正在使用.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.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这看起来非常有用。它看起来不像我想象的那样,所以我很高兴我问了这个问题。谢谢,我会让你知道它是怎么回事!