2015-04-08 29 views
6

Tôi đã tìm kiếm câu trả lời cho điều này ở khắp mọi nơi, nhưng tôi dường như không thể tìm thấy bất kỳ. Tôi về cơ bản có một thiết lập ứng dụng MVC và tôi đang sử dụng được xây dựng trong AttributeRouting cho các tuyến đường của tôi.ASP.NET MVC - Định tuyến thuộc tính không tìm kiếm khu vực xem

Cấu trúc thư mục trông như thế này;

  • Models
  • Lần
  • Controller
  • khu vực
    • Member
      • MemberAreaRegistration.cs
      • Controller
        • HomeController.cs
      • Lần
        • Home
          • Account.cshtml

Và sau đó tôi dây lên các tuyến đường của tôi trong global.asax như thế này;

public class Application : System.Web.HttpApplication { 
    protected void Application_Start(){ 
     AreaRegistration.RegisterAllAreas(); 
     // other web optimization stuff 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
    } 
} 

Vì vậy, MemberAreaRegistration.cs thật đơn giản.

namespace App.Web.Areas.Member { 
    public class MemberAreaRegistration: AreaRegistration { 
     public override string AreaName { get { return "Member"; } } 
    } 
    public override void RegisterArea(AreaRegistrationContext context){ } 
} 

Và tôi cố gắng để dây nó bằng cách sử dụng các thuộc tính ...

/areas/member/controllers/homecontroller.cs

// ... 
[Route("member/account")] 
public ActionResult Account() { return View(); } 
// ... 

Vấn đề là điều này tìm thấy con đường, nhưng nó không thể tìm ra xem. Tôi nhận được lỗi sau đây;

Chế độ xem 'Tài khoản' hoặc không thể tìm thấy tài khoản chính hoặc không có công cụ xem hỗ trợ vị trí được tìm kiếm. Các vị trí sau được tìm kiếm:

~/Views/Home/Account.aspx

~/Views/Home/Account.ascx

~/Views/Shared/Account.aspx

~/Views/Shared/Account.ascx

~/Views/Home/Account.cshtml

~/Views/Home/Account.vbhtml

~/Lượt xem/Chia sẻ/Tài khoản.cshtml

~/Views/Shared/Account.vbhtml

Bằng tất cả tài khoản, điều này sẽ làm việc tốt - và nếu không, tôi hy vọng các ~/area để ít nhất là trong con đường nó đang cố gắng để tìm kiếm. Tôi có phải thêm một thứ gì đó để thực hiện chức năng này không?

Tôi đang sử dụng ASP.NET MVC 5,0

Nếu tôi hardcode đường dẫn tuyệt đối của xem, nó hoạt động. Rõ ràng đây không phải là một tình huống tốt mặc dù. Tôi muốn nó tìm ra quan điểm ngoài quy ước. Nhưng nếu tôi nhập return View("~/areas/member/views/home/account.cshtml"); tôi sẽ xem lại - vì vậy tôi biết nó có thể truy cập vào tệp và điều đó là chính xác.

Đây là

RouteConfig.cs RouteConfig.cs tôi theo yêu cầu

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" } 
     ); 
    } 
} 

Trả lời

17

Đó là bởi vì, một khi bạn đang xác định lộ trình của bạn như là thuộc tính của một hành động, ASP.NET MVC không biết đó diện tích đó là trong, do đó nó không biết nơi để tìm Views.

Trong Bộ điều khiển, hành động Account có trong, hãy thử xác định rõ ràng thuộc tính RouteArea.

Tôi đang viết những dòng này ra khỏi đỉnh đầu của tôi, nhưng nó sẽ giống như thế:

[RouteArea("Member")] 
[RoutePrefix("member")] 
public class HomeController: Controller { 
    [Route("account")] 
    public ActionResult Account() { return View(); } 
} 

hoặc, cách khác:

[RouteArea("Member")] 
public class HomeController: Controller { 
    [Route("member/account")] 
    public ActionResult Account() { return View(); } 
} 
+1

Có! Điều đó dường như đã giải quyết nó! – Ciel

Các vấn đề liên quan