ASP.NET MVC2 Пользовательская маршрутизация с подстановочным или произвольным текстовым URL - PullRequest
2 голосов
/ 28 сентября 2010

У меня есть требование добавить определенную функциональность на веб-сайт asp.net mvc2, чтобы обеспечить дополнительные возможности SEO, следующим образом:

Входящий URL-адрес представляет собой простой текст, возможно содержащий предложение, следующее:

"http://somesite.com/welcome-to-our-web-site" или" http://somesite.com/cool things / check-out-this-awesome-video "

В конвейере MVC я хотел бы взять этот URL, убрать название сайта,ищите оставшуюся часть в таблице базы данных и вызывайте соответствующий контроллер / представление на основе содержимого данных в таблице. Все контроллеры просто берут один параметр bieng с уникальным идентификатором из таблицы поиска. Может использоваться другой контроллеротправка по разным URL-адресам, но это следует исключить из базы данных.

Если URL-адрес не может быть устранен, необходимо указать ошибку 404, если URL-адрес найден, но устарел, то необходимо обеспечить перенаправление 302.

Если URL-адрес разрешен, он должен быть сохранен в адресной строке браузера.

Я посмотрел маршрутМодель и пользовательская маршрутизация не могут понять, как это сделать, используя их, поскольку контроллер не будет предопределен на основе простого маршрута.Я также не уверен в том, что нужно сделать, чтобы предоставить 404, 302 обратно заголовкам.Perhpas Мне нужен пользовательский httpmodule или аналогичный, но выходить за рамки этого я не мог понять.

Это должно быть как-то возможно ... мы сделали это несколько лет назад в Classic ASP.Кто-нибудь может помочь с некоторыми деталями о том, как этого добиться?

1 Ответ

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

Ну, самым простым способом было бы иметь идентификатор где-то в URL (обычно первый вариант)

routes.MapRoute(
    "SEORoute", // Route name
    "{id}/{*seostuff}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional, seostuff = UrlParameter.Optional } // Parameter defaults
);

В вашем контроллере у вас будет что-то вроде

public class HomeController {
    public ActionResult Index(int id) {
        //check database for id
        if(id_exists) {
            return new RedirectResult("whereever you want to redirect", true);
        } else {
            return new HttpNotFoundResult();
        }
    }
}

Если вы не хотите использовать метод id, вы можете сделать что-то еще, как ...

routes.MapRoute(
    "SEORoute", // Route name
    "{category}/{page_name}", // URL with parameters
    new { controller = "Home", action = "Index", category = UrlParameter.Optional, pagename = UrlParameter.Optional } // Parameter defaults
);

public ActionResult Index(string category, string page_name) {
    //same as before but instead of looking for id look for pagename
}

Проблема с последним заключается в том, что вам нужно будет учитывать все типы маршрутов, и это может быть очень сложно, если у вас много параметров, соответствующих различным типам.

Это должно привести вас в правильном направлении. Если вам нужны пояснения, дайте мне знать, и я посмотрю, смогу ли я написать конкретный маршрут, чтобы помочь вам

Дополнительно

Возможно, вы могли бы сделать то, что вы ищете, как

public ActionResult Index() {
    //Create and instance of the new controlle ryou want to handle this request
    SomeController controller = new SomeController();
    controller.ControllerContext = this.ControllerContext;
    return controller.YourControllerAction();
}

но я не знаю никаких побочных эффектов от этого ... так что это, вероятно, не очень хорошая идея - но, похоже, работает.

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