Как установить маршрут по умолчанию (в область) в MVC
Хорошо, об этом уже спрашивали, но там нет твердого решения. Так что для целей себя и других, которые могут найти это полезным.
В MVC2 (ASP.NET) я хочу, чтобы, когда кто-то переходит на сайт, указывается область по умолчанию. Поэтому переход на мой сайт должен отправить вас в ControllerX ActionY в AreaZ.
Используя следующий маршрут в Global.asax
routes.MapRoute(
"Area",
"",
new { area = "AreaZ", controller = "ControllerX ", action = "ActionY " }
);
Теперь это работает так, как будто оно пытается обслужить правильную страницу. Однако MVC продолжает поиск View в корне сайта, а не в папке Area.
Есть ли способ решить эту проблему?
РЕДАКТИРОВАТЬ
Существует "Решение", и это в ControllerX, ActionY возвращает полный путь представления. Немного взломать, но это работает. Однако я надеюсь, что есть лучшее решение.
public ActionResult ActionY()
{
return View("~/Areas/AreaZ/views/ActionY.aspx");
}
Редактировать:
Это также становится проблемой при наличии HTML-ссылки ActionLink на странице. Если область не задана, ссылка на действие выводится пустой.
Все это по замыслу или недостаток?
13 ответов
Это меня заинтересовало, и у меня наконец появилась возможность разобраться в этом. Другие люди, очевидно, не поняли, что это проблема с поиском представления, а не проблема самой маршрутизации - и это, вероятно, потому что заголовок вашего вопроса указывает, что речь идет о маршрутизации.
В любом случае, поскольку это проблема, связанная с View, единственный способ получить то, что вы хотите, - переопределить механизм представления по умолчанию. Обычно, когда вы делаете это, это просто для переключения вашего движка (например, Spark, NHaml и т. Д.). В этом случае нужно переопределить не логику создания представления, а FindPartialView
а также FindView
методы в VirtualPathProviderViewEngine
учебный класс.
Вы можете поблагодарить ваших счастливых звезд за то, что эти методы на самом деле являются виртуальными, потому что все остальное в VirtualPathProviderViewEngine
он даже недоступен - он закрытый, и это очень раздражает, когда переопределяет логику поиска, потому что вам нужно переписать половину уже написанного кода, если вы хотите, чтобы он хорошо работал с кэшем местоположения и форматами местоположения. После нескольких копаний в Reflector мне наконец-то удалось найти рабочее решение.
Что я сделал здесь, так это сначала создал реферат AreaAwareViewEngine
что происходит непосредственно от VirtualPathProviderViewEngine
вместо WebFormViewEngine
, Я сделал это так, что если вы хотите вместо этого создать представления Spark (или что-то еще), вы все равно можете использовать этот класс в качестве базового типа.
Приведенный ниже код довольно скучный, поэтому мы кратко расскажем о том, что он на самом деле делает: {2}
в формат местоположения, который соответствует названию области, таким же образом {1}
соответствует имени контроллера. Это оно! Вот для чего мы должны были написать весь этот код:
BaseAreaAwareViewEngine.cs
public abstract class BaseAreaAwareViewEngine : VirtualPathProviderViewEngine
{
private static readonly string[] EmptyLocations = { };
public override ViewEngineResult FindView(
ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (string.IsNullOrEmpty(viewName))
{
throw new ArgumentNullException(viewName,
"Value cannot be null or empty.");
}
string area = getArea(controllerContext);
return FindAreaView(controllerContext, area, viewName,
masterName, useCache);
}
public override ViewEngineResult FindPartialView(
ControllerContext controllerContext, string partialViewName,
bool useCache)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (string.IsNullOrEmpty(partialViewName))
{
throw new ArgumentNullException(partialViewName,
"Value cannot be null or empty.");
}
string area = getArea(controllerContext);
return FindAreaPartialView(controllerContext, area,
partialViewName, useCache);
}
protected virtual ViewEngineResult FindAreaView(
ControllerContext controllerContext, string areaName, string viewName,
string masterName, bool useCache)
{
string controllerName =
controllerContext.RouteData.GetRequiredString("controller");
string[] searchedViewPaths;
string viewPath = GetPath(controllerContext, ViewLocationFormats,
"ViewLocationFormats", viewName, controllerName, areaName, "View",
useCache, out searchedViewPaths);
string[] searchedMasterPaths;
string masterPath = GetPath(controllerContext, MasterLocationFormats,
"MasterLocationFormats", masterName, controllerName, areaName,
"Master", useCache, out searchedMasterPaths);
if (!string.IsNullOrEmpty(viewPath) &&
(!string.IsNullOrEmpty(masterPath) ||
string.IsNullOrEmpty(masterName)))
{
return new ViewEngineResult(CreateView(controllerContext, viewPath,
masterPath), this);
}
return new ViewEngineResult(
searchedViewPaths.Union<string>(searchedMasterPaths));
}
protected virtual ViewEngineResult FindAreaPartialView(
ControllerContext controllerContext, string areaName,
string viewName, bool useCache)
{
string controllerName =
controllerContext.RouteData.GetRequiredString("controller");
string[] searchedViewPaths;
string partialViewPath = GetPath(controllerContext,
ViewLocationFormats, "PartialViewLocationFormats", viewName,
controllerName, areaName, "Partial", useCache,
out searchedViewPaths);
if (!string.IsNullOrEmpty(partialViewPath))
{
return new ViewEngineResult(CreatePartialView(controllerContext,
partialViewPath), this);
}
return new ViewEngineResult(searchedViewPaths);
}
protected string CreateCacheKey(string prefix, string name,
string controller, string area)
{
return string.Format(CultureInfo.InvariantCulture,
":ViewCacheEntry:{0}:{1}:{2}:{3}:{4}:",
base.GetType().AssemblyQualifiedName,
prefix, name, controller, area);
}
protected string GetPath(ControllerContext controllerContext,
string[] locations, string locationsPropertyName, string name,
string controllerName, string areaName, string cacheKeyPrefix,
bool useCache, out string[] searchedLocations)
{
searchedLocations = EmptyLocations;
if (string.IsNullOrEmpty(name))
{
return string.Empty;
}
if ((locations == null) || (locations.Length == 0))
{
throw new InvalidOperationException(string.Format("The property " +
"'{0}' cannot be null or empty.", locationsPropertyName));
}
bool isSpecificPath = IsSpecificPath(name);
string key = CreateCacheKey(cacheKeyPrefix, name,
isSpecificPath ? string.Empty : controllerName,
isSpecificPath ? string.Empty : areaName);
if (useCache)
{
string viewLocation = ViewLocationCache.GetViewLocation(
controllerContext.HttpContext, key);
if (viewLocation != null)
{
return viewLocation;
}
}
if (!isSpecificPath)
{
return GetPathFromGeneralName(controllerContext, locations, name,
controllerName, areaName, key, ref searchedLocations);
}
return GetPathFromSpecificName(controllerContext, name, key,
ref searchedLocations);
}
protected string GetPathFromGeneralName(ControllerContext controllerContext,
string[] locations, string name, string controllerName,
string areaName, string cacheKey, ref string[] searchedLocations)
{
string virtualPath = string.Empty;
searchedLocations = new string[locations.Length];
for (int i = 0; i < locations.Length; i++)
{
if (string.IsNullOrEmpty(areaName) && locations[i].Contains("{2}"))
{
continue;
}
string testPath = string.Format(CultureInfo.InvariantCulture,
locations[i], name, controllerName, areaName);
if (FileExists(controllerContext, testPath))
{
searchedLocations = EmptyLocations;
virtualPath = testPath;
ViewLocationCache.InsertViewLocation(
controllerContext.HttpContext, cacheKey, virtualPath);
return virtualPath;
}
searchedLocations[i] = testPath;
}
return virtualPath;
}
protected string GetPathFromSpecificName(
ControllerContext controllerContext, string name, string cacheKey,
ref string[] searchedLocations)
{
string virtualPath = name;
if (!FileExists(controllerContext, name))
{
virtualPath = string.Empty;
searchedLocations = new string[] { name };
}
ViewLocationCache.InsertViewLocation(controllerContext.HttpContext,
cacheKey, virtualPath);
return virtualPath;
}
protected string getArea(ControllerContext controllerContext)
{
// First try to get area from a RouteValue override, like one specified in the Defaults arg to a Route.
object areaO;
controllerContext.RouteData.Values.TryGetValue("area", out areaO);
// If not specified, try to get it from the Controller's namespace
if (areaO != null)
return (string)areaO;
string namespa = controllerContext.Controller.GetType().Namespace;
int areaStart = namespa.IndexOf("Areas.");
if (areaStart == -1)
return null;
areaStart += 6;
int areaEnd = namespa.IndexOf('.', areaStart + 1);
string area = namespa.Substring(areaStart, areaEnd - areaStart);
return area;
}
protected static bool IsSpecificPath(string name)
{
char ch = name[0];
if (ch != '~')
{
return (ch == '/');
}
return true;
}
}
Теперь, как уже говорилось, это не конкретный двигатель, поэтому вы должны его создать. Эта часть, к счастью, намного проще, все, что нам нужно сделать, это установить форматы по умолчанию и фактически создать представления:
AreaAwareViewEngine.cs
public class AreaAwareViewEngine : BaseAreaAwareViewEngine
{
public AreaAwareViewEngine()
{
MasterLocationFormats = new string[]
{
"~/Areas/{2}/Views/{1}/{0}.master",
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.master",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Views/{1}/{0}.master",
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.master"
"~/Views/Shared/{0}.cshtml"
};
ViewLocationFormats = new string[]
{
"~/Areas/{2}/Views/{1}/{0}.aspx",
"~/Areas/{2}/Views/{1}/{0}.ascx",
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.aspx",
"~/Areas/{2}/Views/Shared/{0}.ascx",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.aspx"
"~/Views/Shared/{0}.ascx"
"~/Views/Shared/{0}.cshtml"
};
PartialViewLocationFormats = ViewLocationFormats;
}
protected override IView CreatePartialView(
ControllerContext controllerContext, string partialPath)
{
if (partialPath.EndsWith(".cshtml"))
return new System.Web.Mvc.RazorView(controllerContext, partialPath, null, false, null);
else
return new WebFormView(controllerContext, partialPath);
}
protected override IView CreateView(ControllerContext controllerContext,
string viewPath, string masterPath)
{
if (viewPath.EndsWith(".cshtml"))
return new RazorView(controllerContext, viewPath, masterPath, false, null);
else
return new WebFormView(controllerContext, viewPath, masterPath);
}
}
Обратите внимание, что мы добавили несколько записей в стандарт ViewLocationFormats
, Это новые {2}
записи, где {2}
будет сопоставлен с area
мы положили в RouteData
, Я покинул MasterLocationFormats
в одиночку, но, очевидно, вы можете изменить это, если хотите.
Теперь измените ваш global.asax
зарегистрировать этот вид движка:
Global.asax.cs
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new AreaAwareViewEngine());
}
... и зарегистрировать маршрут по умолчанию:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Area",
"",
new { area = "AreaZ", controller = "Default", action = "ActionY" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
Теперь создайте AreaController
мы только что ссылались:
DefaultController.cs (в ~/Controllers/)
public class DefaultController : Controller
{
public ActionResult ActionY()
{
return View("TestView");
}
}
Очевидно, нам нужна структура каталогов и представление, чтобы идти с ней - мы сделаем это очень просто:
TestView.aspx (в ~/Areas/AreaZ/Views/Default/ или ~/Areas/AreaZ/Views/Shared/)
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<h2>TestView</h2>
This is a test view in AreaZ.
И это все. Наконец мы закончили.
По большей части, вы должны быть в состоянии просто взять BaseAreaAwareViewEngine
а также AreaAwareViewEngine
и поместите его в любой проект MVC, так что, несмотря на то, что для этого потребовалось много кода, вы должны написать его только один раз. После этого нужно просто отредактировать несколько строк в global.asax.cs
и создание структуры вашего сайта.
Вот как я это сделал. Я не знаю, почему MapRoute() не позволяет вам установить область, но он возвращает объект маршрута, чтобы вы могли продолжать вносить любые дополнительные изменения, которые вы хотели бы. Я использую это, потому что у меня есть модульный сайт MVC, который продается корпоративным клиентам, и они должны иметь возможность помещать dll в папку bin для добавления новых модулей. Я разрешаю им изменить "HomeArea" в конфиге AppSettings.
var route = routes.MapRoute(
"Home_Default",
"",
new {controller = "Home", action = "index" },
new[] { "IPC.Web.Core.Controllers" }
);
route.DataTokens["area"] = area;
Редактировать: Вы можете попробовать это также в вашей AreaRegistration.RegisterArea для области, в которую пользователь хочет попасть по умолчанию. Я не проверял это, но AreaRegistrationContext.MapRoute делает наборы route.DataTokens["area"] = this.AreaName;
для тебя.
context.MapRoute(
"Home_Default",
"",
new {controller = "Home", action = "index" },
new[] { "IPC.Web.Core.Controllers" }
);
Даже на него уже ответили - это короткий синтаксис (ASP.net 3, 4, 5):
routes.MapRoute("redirect all other requests", "{*url}",
new {
controller = "UnderConstruction",
action = "Index"
}).DataTokens = new RouteValueDictionary(new { area = "Shop" });
Спасибо Аарону за то, что он указал на то, что речь идет о поиске точек зрения, я понял это неправильно.
[ОБНОВЛЕНИЕ] Я только что создал проект, который отправляет пользователя в область по умолчанию, не вмешиваясь ни в один код или пути поиска:
В global.asax зарегистрируйтесь как обычно:
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 = ""} // Parameter defaults,
);
}
в Application_Start()
, убедитесь, что используете следующий порядок;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
в вашей области регистрация, используйте
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"ShopArea_default",
"{controller}/{action}/{id}",
new { action = "Index", id = "", controller = "MyRoute" },
new { controller = "MyRoute" }
);
}
Пример можно найти по адресу http://www.emphess.net/2010/01/31/areas-routes-and-defaults-in-mvc-2-rc/
Я действительно надеюсь, что это то, что вы просили...
////
Я не думаю, что написание псевдо ViewEngine
лучшее решение в этом случае. (Не имея репутации, я не могу комментировать). WebFormsViewEngine
Зона осведомлена и содержит AreaViewLocationFormats
который определяется по умолчанию как
AreaViewLocationFormats = new[] {
"~/Areas/{2}/Views/{1}/{0}.aspx",
"~/Areas/{2}/Views/{1}/{0}.ascx",
"~/Areas/{2}/Views/Shared/{0}.aspx",
"~/Areas/{2}/Views/Shared/{0}.ascx",
};
Я считаю, что вы не придерживаетесь этой конвенции. Вы отправили
public ActionResult ActionY()
{
return View("~/Areas/AreaZ/views/ActionY.aspx");
}
как рабочий взлом, но это должно быть
return View("~/Areas/AreaZ/views/ControllerX/ActionY.aspx");
Если вы не хотите следовать соглашению, вы можете пойти коротким путем, либо WebFormViewEngine
(это делается, например, в MvcContrib), где вы можете установить пути поиска в конструкторе или - немного хакерски - указав свое соглашение следующим образом: Application_Start
:
((VirtualPathProviderViewEngine)ViewEngines.Engines[0]).AreaViewLocationFormats = ...;
Это должно быть выполнено с большей осторожностью, конечно, но я думаю, что это показывает идею. Эти поля public
в VirtualPathProviderViewEngine
в MVC 2 RC.
Я думаю, вы хотите, чтобы пользователь был перенаправлен на ~/AreaZ
URL один раз он посетил ~/
URL. Я бы достиг с помощью следующего кода в вашем корне HomeController
,
public class HomeController
{
public ActionResult Index()
{
return RedirectToAction("ActionY", "ControllerX", new { Area = "AreaZ" });
}
}
И следующий маршрут в Global.asax
,
routes.MapRoute(
"Redirection to AreaZ",
String.Empty,
new { controller = "Home ", action = "Index" }
);
Добавление следующего в мой Application_Start работает для меня, хотя я не уверен, есть ли у вас этот параметр в RC:
var engine = (WebFormViewEngine)ViewEngines.Engines.First();
// These additions allow me to route default requests for "/" to the home area
engine.ViewLocationFormats = new string[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Areas/{1}/Views/{1}/{0}.aspx", // new
"~/Areas/{1}/Views/{1}/{0}.ascx", // new
"~/Areas/{1}/Views/{0}.aspx", // new
"~/Areas/{1}/Views/{0}.ascx", // new
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
Во-первых, какую версию MVC2 вы используете? Там были значительные изменения от предварительного просмотра 2 до RC.
Предполагая, что вы используете RC, я думаю, что ваше отображение маршрута должно выглядеть по-другому. в AreaRegistration.cs
в вашем регионе вы можете зарегистрировать какой-то маршрут по умолчанию, например
context.MapRoute(
"ShopArea_default",
"{controller}/{action}/{id}",
new { action = "Index", id = "", controller="MyRoute" }
);
Приведенный выше код отправит пользователя на MyRouteController
в нашем ShopArea
по умолчанию.
Использование пустой строки в качестве второго параметра должно вызвать исключение, поскольку должен быть указан контроллер.
Конечно, вам придется изменить маршрут по умолчанию в Global.asax
поэтому он не мешает этому маршруту по умолчанию, например, с помощью префикса для основного сайта.
См. Также эту ветку и ответ Хаака: Порядок маршрутов MVC 2 AreaRegistration
Надеюсь это поможет.
То, что я сделал, чтобы заставить это работать, является следующим:
- Я создал контроллер по умолчанию в папке root/Controllers. Я назвал свой контроллер DefaultController.
В контроллере я добавил следующий код:
namespace MyNameSpace.Controllers { public class DefaultController : Controller { // GET: Default public ActionResult Index() { return RedirectToAction("Index", "ControllerName", new {area = "FolderName"}); } } }
В моем RouterConfig.cs я добавил следующее:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new {controller = "Default", action = "Index", id = UrlParameter.Optional});
Суть всего этого в том, что я создал конструктор по умолчанию, который всегда будет контроллером запуска при каждом запуске моего приложения. Когда он попадает на контроллер по умолчанию, он перенаправляется на любой контроллер, указанный в действии индекса по умолчанию. Что в моем случае
www.myurl.com/FolderName/ControllerName
,
Принятое решение этого вопроса состоит в том, что при правильном изложении того, как создать механизм пользовательского представления, он не дает правильного ответа на вопрос. Проблема здесь в том, что Пино неправильно указывает свой маршрут по умолчанию. В частности, его определение "области" неверно. "Площадь" проверяется с помощью коллекции DataTokens и должна быть добавлена следующим образом:
var defaultRoute = new Route("",new RouteValueDictionary(){{"controller","Default"},{"action","Index"}},null/*constraints*/,new RouteValueDictionary(){{"area","Admin"}},new MvcRouteHandler());
defaultRoute.DataTokens.Add("Namespaces","MyProject.Web.Admin.Controller");
routes.Add(defaultRoute);
Указанная "область" в объекте по умолчанию будет игнорироваться. Приведенный выше код создает маршрут по умолчанию, который отслеживает запросы к корню вашего сайта, а затем вызывает контроллер по умолчанию, действие Index в области администрирования. Также обратите внимание, что ключ "Пространства имен" добавляется в DataTokens, это требуется только в том случае, если у вас несколько контроллеров с одинаковым именем. Это решение проверено с Mvc2 и Mvc3 .NET 3.5/4.0
Ну, хотя создание собственного движка представления может работать для этого, все же у вас может быть альтернатива:
- Решите, что вам нужно показать по умолчанию.
- Это что-то имеет контроллер и действие (и область), верно?
- Откройте эту регистрацию области и добавьте что-то вроде этого:
public override void RegisterArea(AreaRegistrationContext context) { //this makes it work for the empty url (just domain) to act as current Area. context.MapRoute( "Area_empty", "", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new string[] { "Area controller namespace" } ); //other routes of the area }
Ура!
Обнаружение различных строительных блоков выполняется в жизненном цикле запроса. Одним из первых шагов в жизненном цикле запроса ASP.NET MVC является сопоставление запрошенного URL-адреса с правильным методом действия контроллера. Этот процесс называется маршрутизацией. Маршрут по умолчанию инициализируется в файле Global.asax и описывает платформе ASP.NET MVC, как обрабатывать запрос. Если дважды щелкнуть файл Global.asax в проекте MvcApplication1, отобразится следующий код:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;
namespace MvcApplication1 {
public class GlobalApplication : System.Web.HttpApplication
{
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 = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
В обработчике события Application_Start(), который запускается при компиляции приложения или перезапуске веб-сервера, регистрируется таблица маршрутов. Маршрут по умолчанию называется Default и отвечает на URL-адрес в форме http://www.example.com/{controller} / {action} / {id}. Переменные между {и} заполняются фактическими значениями из URL запроса или значениями по умолчанию, если в URL нет переопределения. Этот маршрут по умолчанию будет сопоставлен с контроллером Home и методом действия Index в соответствии с параметрами маршрутизации по умолчанию. У нас не будет никаких других действий с этой картой маршрутизации.
По умолчанию все возможные URL могут быть сопоставлены через этот маршрут по умолчанию. Также возможно создание собственных маршрутов. Например, давайте сопоставим URL-адрес http://www.example.com/Employee/Maarten с контроллером Employee, действием Show и параметром firstname. Следующий фрагмент кода может быть вставлен в только что открытый файл Global.asax. Поскольку платформа ASP.NET MVC использует первый соответствующий маршрут, этот фрагмент кода должен быть вставлен выше маршрута по умолчанию; в противном случае маршрут никогда не будет использоваться.
routes.MapRoute(
"EmployeeShow", // Route name
"Employee/{firstname}", // URL with parameters
new { // Parameter defaults
controller = "Employee",
action = "Show",
firstname = ""
}
);
Теперь давайте добавим необходимые компоненты для этого маршрута. Прежде всего, создайте класс с именем EmployeeController в папке Controllers. Вы можете сделать это, добавив новый элемент в проект и выбрав шаблон класса контроллера MVC, расположенный под Web | Категория MVC. Удалите метод действия Index и замените его методом или действием с именем Show. Этот метод принимает параметр firstname и передает данные в словарь ViewData. Этот словарь будет использоваться представлением для отображения данных.
Класс EmployeeController будет передавать объект Employee в представление. Этот класс Employee должен быть добавлен в папку Models (щелкните правой кнопкой мыши на этой папке, а затем выберите Add | Class из контекстного меню). Вот код для класса Employee:
namespace MvcApplication1.Models {
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
}
routes.MapRoute(
"Area",
"{area}/",
new { area = "AreaZ", controller = "ControlerX ", action = "ActionY " }
);
Вы пробовали это?
Хм, я не знаю, почему все это программирование, я думаю, что оригинальная проблема легко решается путем указания этого маршрута по умолчанию...
routes.MapRoute("Default", "{*id}",
new { controller = "Home"
, action = "Index"
, id = UrlParameter.Optional
}
);