好的,这之前已经被问过了,但是没有可靠的解决方案。所以为了我自己和其他可能觉得这很有用的人。
在MVC2 (ASP.NET)中,我想要它,所以当有人导航到网站时,会有一个指定的默认区域。因此,导航到my site应该会将您带到AreaZ中的ControllerX ActionY。
在Global.asax中使用以下路由
routes.MapRoute(
"Area",
"",
new { area = "AreaZ", controller = "ControllerX ", action = "ActionY " }
);
现在,它的工作方式是尝试为正确的页面提供服务。但是,MVC继续在站点的根目录中而不是Area文件夹中查找View。
有没有办法解决这个问题?
编辑
有一个“解决方案”,那就是在ControllerX中,ActionY返回视图的完整路径。这是一个小技巧,但它确实可以工作。然而,我希望有一个更好的解决方案。
public ActionResult ActionY()
{
return View("~/Areas/AreaZ/views/ActionY.aspx");
}
编辑:
当拥有页面的超文本标记语言ActionLink时,这也成为一个问题。如果未设置该区域,则操作链接输出为空。
所有这些都是设计出来的还是有缺陷的?
发布于 2010-07-30 01:05:52
我就是这么做的。我不知道为什么MapRoute()不允许您设置区域,但它确实返回了路由对象,因此您可以继续进行任何您想要的附加更改。我使用这个是因为我有一个出售给企业客户的模块化MVC站点,他们需要能够将dll放到bin文件夹中以添加新模块。我允许他们更改AppSettings配置中的"HomeArea“。
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" }
);
发布于 2012-04-20 23:55:23
即使它已经被回答了-这是简短的语法(ASP.net 3,4,5):
routes.MapRoute("redirect all other requests", "{*url}",
new {
controller = "UnderConstruction",
action = "Index"
}).DataTokens = new RouteValueDictionary(new { area = "Shop" });
发布于 2010-02-01 00:41:26
感谢Aaron指出它是关于定位视图的,我误解了这一点。
更新我刚刚创建了一个项目,该项目默认将用户发送到一个区域,而不会扰乱任何代码或查找路径:
在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中实现)的较短路径,您可以在构造函数中设置查找路径,也可以采用-a方式-通过在Application_Start
上指定如下约定
((VirtualPathProviderViewEngine)ViewEngines.Engines[0]).AreaViewLocationFormats = ...;
当然,这应该更小心一点,但我认为这表明了这一想法。这些字段是MVC2RC中VirtualPathProviderViewEngine
中的public
。
https://stackoverflow.com/questions/2140208
复制相似问题