ASP.NET MVC - 属性路由找不到区域视图

11

我在各处搜寻答案,但似乎找不到。我的 MVC 应用程序已经设置好,并且我正在使用内置的 AttributeRouting 来处理路由。

我的文件夹结构如下:

  • Models
  • Views
  • Controllers
  • Areas
    • Member
      • MemberAreaRegistration.cs
      • Controllers
        • HomeController.cs
      • Views
        • Home
          • 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(); }
// ...

问题是这个函数找到了路由,但无法找到视图。我收到以下错误信息:

未找到视图“Account”或其主控件,也没有视图引擎支持所搜索的位置。已搜索以下位置:

~/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。

如果硬编码视图的绝对路径,它可以工作。显然这不是一个好的方案,我更希望它能够按照约定查找视图。但如果我键入 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" }
        );
    }
}
1个回答

23

这是因为,一旦您将路由定义为操作的属性,ASP.NET MVC 就不知道它所在的区域,因此不知道要查找哪个视图。

在控制器中,尝试明确指定 RouteArea 属性,以确定 Account 操作所在的区域。

我是凭记忆在写这篇文章的,但它应该像这样:

[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(); }
}

1
现在似乎需要 [RouteArea("Member", AreaPrefix = "")] 才能使其工作。 - Esben Skov Pedersen
是的,我曾经遇到过同样的问题,一旦我在控制器上加上了[RouteArea("Member")],一切都正常工作了。 - David Fawzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接