ASP.NET MVC - 属性路由未找到区域视图
ASP.NET MVC - Attribute Routing not finding area view
我一直在到处寻找这个问题的答案,但我似乎找不到任何答案。我基本上有一个 MVC 应用程序设置,我正在为我的路由使用内置的 AttributeRouting
。
文件夹结构如下所示;
- 型号
- 观看次数
- 控制器
- 地区
- 会员
- MemberAreaRegistration.cs
- 控制器
- HomeController.cs
- 观看次数
- 首页
- Account.cshtml
然后我像这样在 global.asax
中连接我的路线;
public class Application : System.Web.HttpApplication {
protected void Application_Start(){
AreaRegistration.RegisterAllAreas();
// other web optimization stuff
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
那么,MemberAreaRegistration.cs
就简单了
namespace App.Web.Areas.Member {
public class MemberAreaRegistration: AreaRegistration {
public override string AreaName { get { return "Member"; } }
}
public override void RegisterArea( AreaRegistrationContext context){ }
}
然后我尝试使用属性连接它...
/areas/member/controllers/homecontroller.cs
// ...
[Route("member/account")]
public ActionResult Account() { return View(); }
// ...
问题是这个找到了路由,但是找不到视图。我收到以下错误;
The view 'Account' or its master was not found or no view engine
supports the searched locations. The following locations were
searched:
~/Views/Home/Account.aspx
~/Views/Home/Account.ascx
~/Views/Shared/Account.aspx
~/Views/Shared/Account.ascx
~/Views/Home/Account.cshtml
~/Views/Home/Account.vbhtml
~/Views/Shared/Account.cshtml
~/Views/Shared/Account.vbhtml
从各方面来看,这应该可以正常工作 - 如果没有,我希望 ~/area
至少在它试图搜索的路径中。我是否必须连接一些额外的东西才能实现这个功能?
我正在使用 ASP.NET MVC 5.0
If 我硬编码 视图的绝对路径,有效。显然,这不是一个好情况。我更希望它能找到不符合惯例的观点。但是,如果我输入 return View("~/areas/member/views/home/account.cshtml");
,我确实会返回视图 - 所以我知道它可以访问文件并且它是正确的。
这是我的 RouteConfig.cs
每个请求
RouteConfig.cs
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes) {
// mvc attribute routing allows us to supersede normal routing mechanisms and
// declare our routes a bit more verbosely
routes.MapMvcAttributeRoutes();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "App.Web.Controllers" }
);
}
}
那是因为,一旦您将路由定义为动作的属性,ASP.NET MVC 不知道它在哪个区域,因此它不知道到哪里寻找视图。
在 Account
动作所在的控制器中,尝试明确指定 RouteArea
属性。
我是随手写下的,但它看起来应该是这样的:
[RouteArea("Member")]
[RoutePrefix("member")]
public class HomeController: Controller {
[Route("account")]
public ActionResult Account() { return View(); }
}
或者,或者:
[RouteArea("Member")]
public class HomeController: Controller {
[Route("member/account")]
public ActionResult Account() { return View(); }
}
我一直在到处寻找这个问题的答案,但我似乎找不到任何答案。我基本上有一个 MVC 应用程序设置,我正在为我的路由使用内置的 AttributeRouting
。
文件夹结构如下所示;
- 型号
- 观看次数
- 控制器
- 地区
- 会员
- MemberAreaRegistration.cs
- 控制器
- HomeController.cs
- 观看次数
- 首页
- Account.cshtml
- 首页
- 会员
然后我像这样在 global.asax
中连接我的路线;
public class Application : System.Web.HttpApplication {
protected void Application_Start(){
AreaRegistration.RegisterAllAreas();
// other web optimization stuff
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
那么,MemberAreaRegistration.cs
就简单了
namespace App.Web.Areas.Member {
public class MemberAreaRegistration: AreaRegistration {
public override string AreaName { get { return "Member"; } }
}
public override void RegisterArea( AreaRegistrationContext context){ }
}
然后我尝试使用属性连接它...
/areas/member/controllers/homecontroller.cs
// ...
[Route("member/account")]
public ActionResult Account() { return View(); }
// ...
问题是这个找到了路由,但是找不到视图。我收到以下错误;
The view 'Account' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Account.aspx
~/Views/Home/Account.ascx
~/Views/Shared/Account.aspx
~/Views/Shared/Account.ascx
~/Views/Home/Account.cshtml
~/Views/Home/Account.vbhtml
~/Views/Shared/Account.cshtml
~/Views/Shared/Account.vbhtml
从各方面来看,这应该可以正常工作 - 如果没有,我希望 ~/area
至少在它试图搜索的路径中。我是否必须连接一些额外的东西才能实现这个功能?
我正在使用 ASP.NET MVC 5.0
If 我硬编码 视图的绝对路径,有效。显然,这不是一个好情况。我更希望它能找到不符合惯例的观点。但是,如果我输入 return View("~/areas/member/views/home/account.cshtml");
,我确实会返回视图 - 所以我知道它可以访问文件并且它是正确的。
这是我的 RouteConfig.cs
每个请求
RouteConfig.cs
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes) {
// mvc attribute routing allows us to supersede normal routing mechanisms and
// declare our routes a bit more verbosely
routes.MapMvcAttributeRoutes();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "App.Web.Controllers" }
);
}
}
那是因为,一旦您将路由定义为动作的属性,ASP.NET MVC 不知道它在哪个区域,因此它不知道到哪里寻找视图。
在 Account
动作所在的控制器中,尝试明确指定 RouteArea
属性。
我是随手写下的,但它看起来应该是这样的:
[RouteArea("Member")]
[RoutePrefix("member")]
public class HomeController: Controller {
[Route("account")]
public ActionResult Account() { return View(); }
}
或者,或者:
[RouteArea("Member")]
public class HomeController: Controller {
[Route("member/account")]
public ActionResult Account() { return View(); }
}