Правило маршрутизации для веб-сайта продуктов ASP.NET - PullRequest
1 голос
/ 18 июля 2009

Я создаю каталог продуктов для веб-сайта клиента под ASP.NET с использованием .NET Framework 3.5 SP1. Каждый продукт имеет номер детали и номер детали OEM (все уникальны).

В целях SEO я хотел бы, чтобы номер детали 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

Я также хотел бы услышать ваши другие предложения по SEO (нас в первую очередь интересует Google), если они у вас есть.

Спасибо.

ВАЖНО: Это не сайт MVC, поэтому у меня нет контроллеров.

Ответы [ 3 ]

1 голос
/ 18 июля 2009

Вы должны быть в состоянии указать что-то вроде http://www.mydomain.com/oempartnumber/oem и http://www.mydomain.com/mypartnumber/pn. В URL-адресе должно быть что-то, что позволит вам выбрать контроллер, который вы хотите использовать, и еще больше позволит вам различать номер детали и номер детали oem (если только они не являются уникальными по отношению друг к другу. Если между oem и pn никогда не будет совпадений, вы можете получить http://www.mydomain.com/{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
    }
);

Но проблема здесь в том, что номер детали 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. Затем вы можете указать метод Init

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

Это указывает на ваш метод Applicaton_OnAfterProcess:

private void Application_OnAfterProcess (источник объекта, EventArgs e)

{
    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...

Как только вы изолируете свой идентификатор продукта, вы можете переписать URL-адрес (на стороне сервера) и направить пользователя на соответствующую страницу productDetails.aspx.

context.RewritePath("~/products/productDetails.aspx?ProductID=" + ProductID.ToString());

Таким образом, пока пользователь и Google увидят http://www.mydomain.com/1234, ваше приложение увидит http://www.mydomain.com/products/productdetails.aspx?productid=1234, и вы можете кодировать его как обычно.

Надеюсь, это то, что вы искали вместо этого!

1 голос
/ 17 сентября 2010

Я вижу, что вы уже приняли ответ, но позвольте мне опубликовать новый, более простой.

Это не сайт MVC, поэтому у меня нет контроллеры.

Если вы используете веб-формы, это для вас : Использование маршрутизации с веб-формами

По сути, вы должны создать свой собственный IRouteHandler и настроить маршруты к нему. Затем вы можете использовать его для сопоставления любого количества URL-адресов с вашими веб-формами. Это избавит вас от старого метода перезаписи URL и таких грязных трюков. (Ссылка для скачивания в этой записи блога больше не работает, но ее довольно просто реализовать. В любом случае, если вам нужен рабочий пример, я могу предоставить вам один.)

1 голос
/ 18 июля 2009

Если есть определенные форматы для номеров деталей, вы можете использовать ограничения регулярных выражений на маршруте следующим образом:

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

Текст вроде "welcome" не будет соответствовать регулярному выражению и поэтому будет игнорировать этот маршрут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...