我试图在MVC应用程序中使用区域,我希望默认路由将被解析为管理区域内的HomeController,但它会解析为根站点中的家庭控制器。 我添加了admin HomeController的命名空间,但它仍然解析为根HomeController。
我的路线配置:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] {"MvcApplicationAreas.Areas.Admin.Controllers"}
);
}
}
管理区域路线
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
HomeController - 管理区域
namespace MvcApplicationAreas.Areas.Admin.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
知道为什么它不能正确解决? 谢谢
答案 0 :(得分:37)
最直接的方法是将数据令牌添加到默认路由:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional }
).DataTokens.Add("area", "Admin");
只需添加
.DataTokens.Add("area", "[your area name]");
到默认路由定义的末尾。
答案 1 :(得分:9)
我已经测试了区域注册的代码,它可以工作并选择正确的控制器。但是,即使使用了正确的控制器,视图分辨率也会在根文件夹中找到该视图。
为了测试,我在我的区域家庭控制器中使用了以下主页索引操作:
public ActionResult Index()
{
return View(model: "Admin area home controller");
}
然后我在/ Views / Home中的index.chstml:
Root View: @Model
和/ Areas / Admin / Views / Home中的index.cshtml:
Admin Area view: @Model
运行时,输出为:
Root View:管理区域主控制器
因此路由使管理区域中的主控制器运行,但随后视图分辨率继续并找到根视图而不是管理视图。
所以最后,视图选择确实是错误的,因此您的问题与How to set a Default Route (To an Area) in MVC中的问题相同。
答案 2 :(得分:6)
此解决方案将破坏您的API路线。 您必须为每个区域指定一些唯一的名称,例如默认区域:
context.MapRoute(
"Common_default",
"**Common**/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
以下默认路线的正确解决方案:
网络区域路线:
context.MapRoute(
"Common_default",
"Common/{culture}/{controller}/{action}/{id}",
new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
);
将用户重定向到“公共”区域的主要路线:
routes.MapRoute(
name: "Default",
url: "{culture}/{controller}/{action}/{id}",
defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "SMS.Sender.Areas.Common.Controllers" }
).DataTokens.Add("area","Common");
答案 3 :(得分:2)
尝试这样做....它将有助于区分。即使你不添加区域=" Web",它的罚款
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", area="Web", id = UrlParameter.Optional },
new[] { "Nop.Web.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
同样的方式
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", area = "Admin", id = "" },
new[] { "Nop.Admin.Controllers" }
);
答案 4 :(得分:1)
在默认的根主控制器中添加Index操作方法。在Index操作方法中使用" return redirecttoaction"默认区域重定向的声明
public ActionResult Index()
{
return RedirectToAction("Dashboard", "Home", new {area = "Home"});
}
默认路线应为
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {controller = "Home",
action = "Index", id = UrlParameter.Optional}
);
答案 5 :(得分:0)
从AreaRegistration页面区域路由的最简单方法:
context.MapRoute("MainDefault", "Main/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } , new[] { "Namespace.To.Controllers" });
context.MapRoute("ClearPath", "", new { controller = "Home", action = "Index" }, new[] { "Namespace.To.Controllers" });
答案 6 :(得分:0)
在你的
中RouteConfig.cs
routes.MapRoute("redirect all other requests", "{*url}",
new {
controller = "UnderConstruction",
action = "Index"
}).DataTokens = new RouteValueDictionary(new { area = "Shop" });
答案 7 :(得分:0)
默认路由是默认路由,MVC首先会调用,因为在MVC中首先指定了哪条路由,它会像那样调用