我正在尝试使用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"}
);
}
}
Run Code Online (Sandbox Code Playgroud)
管理区域路线
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 }
);
}
}
Run Code Online (Sandbox Code Playgroud)
HomeController - 管理区域
namespace MvcApplicationAreas.Areas.Admin.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
Run Code Online (Sandbox Code Playgroud)
知道为什么它不能正确解决?谢谢
Nov*_*Joe 38
最直接的方法是将数据令牌添加到默认路由:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional }
).DataTokens.Add("area", "Admin");
Run Code Online (Sandbox Code Playgroud)
只需添加
.DataTokens.Add("area", "[your area name]");
Run Code Online (Sandbox Code Playgroud)
到默认路由定义的末尾.
我已经测试了区域注册的代码,它可以工作并选择正确的控制器.但是,即使使用了正确的控制器,视图分辨率也会在根文件夹中找到该视图.
为了测试,我在我的区域家庭控制器中使用了以下主页索引操作:
public ActionResult Index()
{
return View(model: "Admin area home controller");
}
Run Code Online (Sandbox Code Playgroud)
然后我在/ Views/Home中的index.chstml:
Root View: @Model
Run Code Online (Sandbox Code Playgroud)
和/ Areas/Admin/Views/Home中的index.cshtml:
Admin Area view: @Model
Run Code Online (Sandbox Code Playgroud)
运行时,输出为:
Root View:管理区域主控制器
因此路由使管理区域中的主控制器运行,但随后视图分辨率继续并找到根视图而不是管理视图.
所以最后,视图选择确实是错误的,因此您的问题与如何在MVC中设置默认路由(到某个区域)相同.
此解决方案将破坏您的API路线.您必须为每个区域指定一些唯一的名称,例如默认区域:
context.MapRoute(
"Common_default",
"**Common**/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
以下默认路由的正确解决方案:
网站路线:
context.MapRoute(
"Common_default",
"Common/{culture}/{controller}/{action}/{id}",
new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
将用户重定向到"公共"区域的主要路线:
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");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29985 次 |
| 最近记录: |