C # MVC 3 Root Route, похоже, не работает - PullRequest
1 голос
/ 14 февраля 2011

РЕДАКТИРОВАТЬ: Извините, я плохо объяснил. По сути, в приведенном ниже примере я хочу, чтобы «this-is-hand-by-by-content-controller» был «id», поэтому я могу получить его в ContentController в качестве параметра действия, но я хочу получить к нему доступ через root сайта, например, mysite.com/this-is-not-passed-to-homecontroller.

Я пытаюсь создать корневой маршрут, который пойдет на отдельный контроллер (вместо домашнего).

Я следовал примеру "RootController", опубликованному где-то еще, который реализует IRouteConstraint, но он просто не работает, и я уже потратил на это пару часов!

По сути, у меня есть LoginController, HomeController и ContentController.

Я хочу иметь возможность просматривать HomeController / Index, перейдя на http://mysite/. Я хочу иметь возможность просматривать LoginController / Index, перейдя на http://mysite/Login. Но .. Я хочу ContentController / Index вызываться при возникновении любого другого результата, например: http: / mysite / this-is-hand-by-by-content-controller

Есть ли элегантный способ сделать это, который работает?

Это была моя последняя попытка .. Я вырезал / вставил / скопировал / почесал голову так много раз, что немного грязно:

routes.MapRoute(
            "ContentPages",
            "{action}",
            new { Area = "", controller = "ContentPages", action = "View", id = UrlParameter.Optional },
            new RootActionConstraint()
            );

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

Любая помощь очень ценится!

1024 * Хим *

Ответы [ 2 ]

1 голос
/ 04 июня 2011

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

routes.MapRoute(
    "HomePage",
    "",
    new { controller = "Home", action = "Index", id="" }
);
routes.MapRoute(
    "Home",
    "home/{action}/{id}",
    new { controller = "Home", action = "Index", id="" }
);
routes.MapRoute(
    "Login",
    "Login/{action}/{id}",
    new { controller = "Login", action = "Index", id="" }
);
//... if you have other controller, specify the name here

routes.MapRoute(
    "Content",
    "{*id}",
    new { controller = "Content", action = "Index", id="" }
);

Первый маршрут предназначен для вашего сайта youwebsite.com/, который называется Home-> Index. Второй путь предназначен для других действий на вашем домашнем контроллере (yourwebsite.com/home/ACTION).

Третий - для вашего LoginController (yourwebsite.com/login/ACTION).

И последний - для вашего Контента-> Индекс (yourwebsite.com/anything-that-goes-here).

public ActionResult Index(string id)
{
  // id is "anything-that-goes-here
}
0 голосов
/ 14 февраля 2011

Если у вас есть ContentController.Index(string id) для обработки маршрутов, соответствующих ограничению, это должно работать:

routes.MapRoute(
        "ContentPages",
        "{id}",
        new { Area = "", controller = "Content", action = "Index" },
        new { id = new RootActionConstraint() }
        );

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}",
        new { Area = "", controller = "Home", action = "Index", id = UrlParameter.Optional },
        new string[] { "Website.Controllers" }
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...