你应该能够指定类似http://www.mydomain.com/oempartnumber/oem和http://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,您可以针对它编写像往常一样。
我希望这是你正在寻找的东西!
这不是一个MVC网站,所以我没有控制器。 – 2009-07-18 19:07:09
但是,您可以在不使用MVC的情况下将路由机制与路由约束一起使用http://www.codeproject.com/KB/aspnet/url_rewriting_routing.aspx – 2009-07-18 19:36:56