Чтобы направить URL localhost / London к действию Index на HomeController в области Cities, вам нужен маршрут, подобный следующему:
routes.MapRoute(null,
"{id}",
new
{
area = "Cities", controller = "Home", action = "Index"
}
);
Убедитесь, что этот маршрут объявлен до "Default""маршрут в вашем классе CitiesAreaRegistration.cs.
Однако, если в вашем приложении много других маршрутов, добавление такого общего маршрута может привести к разрушению других маршрутов в приложении.Я предлагаю добавить префикс URL, чтобы отделить этот маршрут от других в вашем приложении:
routes.MapRoute(null,
"cities/{id}",
new
{
area = "Cities", controller = "Home", action = "Index"
}
);
Это сделает ваш URL похожим на localhost / towns / London.Это приемлемо?
Обновление 1
Если вы полностью не удалите свое определение маршрута "По умолчанию", у вас фактически будет несколько INBOUND маршрутов, которые сопоставляются с этим действием.У вас будет localhost/cities/London
, localhost/cityPage/Home
, localhost/cityPage/Home/Index
и localhost/cityPage/Home/Index/London
, все они будут разрешены для этого действия.Однако, когда MVC решает сгенерировать маршрут OUTBOUND, он выберет первый - localhost / towns / London.
Обновление 2
Если вы хотите, чтобы параметром маршрута было cityName, вы должны сделать это:
routes.MapRoute(null,
"cities/{cityName}",
new
{
area = "Cities", controller = "Home", action = "Index"
}
);
Однако тогда вам придетсяизмените действие Index в HomeController вашей области Cities, чтобы иметь эту подпись:
public ActionResult Index(string cityName)
Изменяя аргумент с id на cityName, вы сообщаете MVC передать этот параметр параметра / маршрута URL методу действия.
Обновление 3
Название вашего района "Города" или "CityPage"?Из предыдущего кода это выглядело так, как будто название вашей области было Города.
Если это CitiesPage, попробуйте это для своего метода действия:
@Html.ActionLink("City London", "Index", "Home",
new { area = "CityPage", cityName = "London" })
Окончательный ответ
Я только что воспроизвел это в проекте MVC3,и он работает, как и ожидалось:
- Создан новый район с именем "CityPage"
- Добавлен HomeController с действием Index в область CityPage
- Добавлен индекспросмотр папки CityPage / Views / Home.
CityPageAreaRegistration.cs:
public class CityPageAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "CityPage";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(null,
"CityPage/{cityName}",
new { area = "CityPage", controller = "Home", action = "Index" }
);
//context.MapRoute(
// "CityPage_default",
// "CityPage/{controller}/{action}/{id}",
// new { action = "Index", id = UrlParameter.Optional }
//);
}
}
HomeController.cs:
public class HomeController : Controller
{
//
// GET: /CityPage/Home/
public ActionResult Index(string cityName)
{
return View();
}
}
Index.cshtml:
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
@Html.ActionLink("City London", "Index", "Home",
new { area = "CityPage", cityName = "London" }, null)
Наконец, вот ссылка, сгенерированная ссылкой действия:
<a href="/CityPage/London">City London</a>