Я 'новичок в MVC (и маршрутизации ASP.Net). Я'пытаюсь сопоставить *.aspx
с контроллером под названием PageController
.
routes.MapRoute(
"Page",
"{name}.aspx",
new { controller = "Page", action = "Index", id = "" }
);
Разве приведенный выше код не отображает *.aspx на PageController
? Когда я запускаю это и ввожу любую .aspx страницу, я получаю следующую ошибку:
Контроллер для пути '/Page.aspx' не может быть найден или он не реализует интерфейс IController. Имя параметра: controllerType
Есть ли что-то, что я не делаю здесь?
Я только что ответил на свой собственный вопрос. У меня были маршруты в обратном порядке (по умолчанию был выше страницы). Ниже - правильный порядок. Таким образом, возникает следующий вопрос... как маршрут "По умолчанию" соответствует (я предполагаю, что здесь используются регулярные выражения) маршруту "Страница"?
routes.MapRoute(
"Page",
"{Name}.aspx",
new { controller = "Page", action = "Display", id = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Я только что ответил на свой собственный вопрос. У меня были маршруты в обратном порядке (по умолчанию была над страницей).
Да, вы должны поместить все пользовательские маршруты выше маршрута по умолчанию.
В связи с этим возникает следующий вопрос... каким образом маршрут "По умолчанию" сопоставляется (я предполагаю, что они используют регулярные выражения. здесь) с маршрутом "Страница"?
Маршрут по умолчанию совпадает на основе того, что мы называем "Конвенция над конфигурацией". Скотт Гатри хорошо объясняет это в своей первой статье в блоге об ASP.NET MVC. Я рекомендую вам прочитать ее, а также другие его записи. Имейте в виду, что они были опубликованы на основе первого CTP, а фреймворк изменился. Вы также можете найти веб-каст по ASP.NET MVC на сайте asp.net Скотта Хансельмана.
На одном из Грабят Conery' s MVC Витрина [screencasts] (http://www.asp.net/learn/3.5-SP1/video-356.aspx), он сталкивается с этой точной проблемой. It' s приблизительно в 23-минутной отметке, если you' ре заинтересовано.
Не уверен, как выглядит ваш контроллер, ошибка, похоже, указывает на то, что он не может найти контроллер. Наследовались ли вы от Controller после создания класса PageController? Находится ли PageController в каталоге Controllers?
Вот мой маршрут в файле Global.asax.cs
routes.MapRoute(
"Page",
"{Page}.aspx",
new { controller = "Page", action = "Index", id = "" }
);
Вот мой контроллер, который находится в папке Controllers:
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class PageController : Controller
{
public void Index()
{
Response.Write("Page.aspx content.");
}
}
}
public class AspxRouteConstraint : IRouteConstraint
{
#region IRouteConstraint Members
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return values["aspx"].ToString().EndsWith(".aspx");
}
#endregion
}
зарегистрируйте маршрут для всего aspx
routes.MapRoute("all",
"{*aspx}",//catch all url
new { Controller = "Page", Action = "index" },
new AspxRouteConstraint() //return true when the url is end with ".aspx"
);
И Вы можете проверить маршруты MvcRouteVisualizer