ASP.NET MVC 2.0 Простой вопрос маршрутизации - PullRequest
2 голосов
/ 21 июля 2010

Я нахожусь в процессе переноса нашего сайта с дерьмовой CMS на красивый сайт MVC с пользовательским кодом.Пока что все прошло гладко, но у меня есть некоторые проблемы с маршрутизацией.

Наша компания рассылает множество маркетинговых писем и писем.В них мы можем перейти на целевые страницы, чтобы мы могли отслеживать, как идут кампании, а также предлагать больше информации.Таким образом, в письме было бы сказано «посетите www.OurSite.com/LandingPage».Однако в MVC все страницы по умолчанию размещаются в папках их контроллеров.

Так, скажем, у меня есть страница с названием LP в моем контроллере Home, поэтому URL-адрес - www.OurSite.com/Home/LP

Мне нужно, чтобы он стал www.OurSite.com/LP, как и раньше, поэтому наши маркетинговые кампании не получат 404, как только мы запустим новый веб-сайт.Кроме того, набирать текст намного приятнее, поэтому мы не будем использовать его в будущем.

На основе этого маршрута по умолчанию:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

Я пытался создать что-то подобное:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "LandingPage",
        "{action}/{id}",
        new { controller = "Home", action = "LandingPage", id = UrlParameter.Optional }
    );
}

Но это не решает мою проблему.

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

Следует также отметить, что не все эти страницы будут в контроллере Home.Так что просто удалить маршрут, который не сработает.Наши целевые страницы попадают под множество контроллеров.

Ответы [ 4 ]

4 голосов
/ 22 июля 2010

Я отредактировал твой код в http://pastie.org/1054360. Тебе пришлось поставить свой новый маршрут раньше, чем маршрут по умолчанию.При маршрутизации не имеет значения, какой маршрут больше всего подходит, вызывается ПЕРВЫЙ маршрут, соответствующий URL.В вашем примере http://domain.com/CPA2010 сначала совпадает с маршрутом по умолчанию, потому что ограничения не указаны.Он ищет действие индекса контроллера CPA2010.Попробуйте код здесь, и он должен работать.

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "CPA2010Route", // Route name
            "CPA2010", // URL with parameters
            new { controller = "Home", action = "CPA2010"  } // Parameter defaults
        );

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

    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }
}
3 голосов
/ 22 июля 2010

Похоже, в вашем звонке опечатка View().

Попробуйте: View("~/Views/Home/CPA2010.aspx") или View("CPA2010") или просто View()

3 голосов
/ 22 июля 2010

Похоже, у вас есть две отдельные проблемы.

Первое, что порядок имеет значение при добавлении маршрутов.

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

Как только вы поменяете местами эти маршруты, вы, вероятно, захотите использовать это: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Все, что вам нужно сделать, это добавить ссылку и одну строку кода в ваш global.asax, и вы получите намного лучшую информацию для работы.

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

0 голосов
/ 22 июля 2010

Ваш маршрут просто должен направить к правильному действию, которое тогда возвратит правильное представление.Другими словами, вы можете иметь «www.OurSite.com/LandingPage» и иметь фактический путь представления / Home / LandingPage. Маршрут будет

routes.MapRoute(
        "CPA2010Route", // Route name
        "CPA2010", // URL with parameters
        new { controller = "Home", action = "CPA2010"  } // Parameter defaults
    );

Затем в действии LandingPage вы вернете путьна просмотр:

public ActionResult CPA2010()
{
    return View("~/Views/Home/CPA2010.aspx");
}

Ваш маршрут по умолчанию должен идти последним в том порядке, в котором определены маршруты, или иначе он будет соответствовать этому маршруту и ​​всем остальным. Затем он попытается направить вас на главную страницу.Индексное действие контроллера не то, что вам нужно. Если вы переместите этот маршрут на вершину, он будет соответствовать правильно и избавится от ваших 404

...