我一直在寻找各地的答案,但我似乎找不到任何答案。我基本上有一个MVC应用程序设置,我使用内置的AttributeRouting
作为我的路由。
文件夹结构如下所示;
然后我按照这样的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(); }
// ...
问题是这会找到路径,但找不到视图。我收到以下错误;
未找到“帐户”或其主视图,或者没有查看引擎 支持搜索的位置。以下地点是 搜索:
〜/ Views / Home / Account.aspx
〜/查看/主页/ Account.ascx
〜/查看/共享/ Account.aspx
〜/查看/共享/ Account.ascx
〜/ Views / Home / Account.cshtml
〜/查看/主页/ Account.vbhtml
〜/查看/共享/ Account.cshtml
〜/查看/共享/ Account.vbhtml
从各方面来看,这应该可以正常工作 - 如果没有,我希望~/area
至少在它试图搜索的路径中。为了实现这个功能,我是否需要另外添加一些东西?
我正在使用ASP.NET MVC 5.0
如果 硬编码视图的绝对路径,则可以正常工作。显然这不是一个好的情况。我希望它能找到超出常规的观点。但是,如果我输入return View("~/areas/member/views/home/account.cshtml");
,我确实会收到视图 - 所以我知道它可以访问文件并且它是正确的。
以下是我的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" }
);
}
}
答案 0 :(得分:20)
这是因为,一旦将路由定义为动作的属性,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(); }
}