Làm cách nào để chỉ định các Bố cục khác nhau trong tệp ViewStart của ASP.NET MVC 3?


313

Tôi muốn có 2 Bố cục riêng trong ứng dụng của mình. Giả sử một phần dành cho phần Công khai của trang web và phần còn lại dành cho phía Thành viên.

Để đơn giản, hãy nói tất cả logic cho từng trang web của luận án được gói gọn gàng vào 2 bộ điều khiển riêng biệt.

  • Bộ điều khiển công cộng
  • Nhân viên kiểm soát

Và mỗi cái đều có Bố cục tương ứng cho tất cả các Chế độ xem bên dưới.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Làm cách nào để tôi sử dụng tệp _ViewStart.cshtml để chỉ định rằng tất cả Chế độ xem / Hành động trong "Công khai" sử dụng PublicLayout và mọi thứ trong "Nhân viên" đều sử dụng StaffLayout?

Cảm ơn!


4
Chỉ trong trường hợp: nếu bạn muốn xóa bố cục cho một Razorchế độ xem nhất định , chỉ cần đặtLayout = null;
Leniel Maccaferri

3
Giống như một nhận xét cho ví dụ của bạn, có lẽ bạn không nên có bộ điều khiển có tên Công khai và Nhân viên. Các bộ điều khiển thường được triển khai như là điểm khởi đầu cho hành động giống CRUD trên các thực thể kinh doanh quan trọng nhất định, như EventContoder, UserContoder hoặc tương tự. Nếu ứng dụng của bạn lớn một cách hợp lý, trách nhiệm của bộ điều khiển Công cộng / Nhân viên sẽ là rộng lớn. Hãy xem xét các khu vực thay thế. msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Bạn có thể nhận thức được điều này, nhưng người khác đọc bài viết này có thể nhận được các ý tưởng sai lầm, vì vậy chỉ cần để ghi lại.
Alex

Câu trả lời:


558

Bạn có thể đặt một _ViewStart.cshtmltệp bên trong /Views/Publicthư mục sẽ ghi đè tệp mặc định trong /Viewsthư mục và chỉ định bố cục mong muốn:

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}

Bằng cách tương tự, bạn có thể đặt một _ViewStart.cshtmltệp khác trong /Views/Staffthư mục với:

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}

Bạn cũng có thể chỉ định bố cục nào sẽ được sử dụng khi trả về chế độ xem bên trong hành động của bộ điều khiển nhưng đó là mỗi hành động:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

Tuy nhiên, một khả năng khác là bộ lọc hành động tùy chỉnh sẽ ghi đè lên bố cục. Như bạn có thể thấy nhiều khả năng để đạt được điều này. Tùy thuộc vào bạn để chọn cái nào phù hợp nhất trong kịch bản của bạn.


CẬP NHẬT:

Như được yêu cầu trong phần bình luận, đây là một ví dụ về bộ lọc hành động sẽ chọn trang chính:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

và sau đó trang trí một bộ điều khiển hoặc một hành động với thuộc tính tùy chỉnh này chỉ định bố cục bạn muốn:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

1
@DarinDimitrov Nơi tôi sẽ tạo LayoutInjecterAttribute. ? Có vị trí cụ thể nào không?
kbvishnu

2
@VeeKeyBee, bạn có thể đặt nó trong một ActionFiltersthư mục con.
Darin Dimitrov

Một vấn đề tiềm ẩn với LayoutInjecterAttribute: Nó được gọi trướcOnException phương thức của bộ điều khiển . Vì vậy, nếu bộ điều khiển cung cấp kết quả xem trong quá trình xử lý ngoại lệ, bố cục sẽ không được đặt.
Jeff Sharp

Là một người mới với MVC, tôi muốn nói lời cảm ơn vì đã dạy tôi rất nhiều trong câu trả lời này. Tuy nhiên tôi không hiểu chuyện gì đang xảy ra bên trong OnActionExecuted. Bạn có thể vui lòng cập nhật câu trả lời cho tôi.
Imad

29

Một phương pháp nữa là Xác định Bố cục bên trong Chế độ xem:

   @{
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
    }

Nhiều cách để làm, có thể được tìm thấy ở đây , hy vọng điều này sẽ giúp ai đó.


1
Điều này sẽ không hoạt động - nếu không có _ViewStart.cshtml riêng biệt, chế độ xem của bạn sẽ vẫn hiển thị bên trong phương thức @RenderBody () trong bố cục khác.
Tillman32

Điều này! Tại sao mọi người lại đưa ra các quy trình cực kỳ phức tạp này khi tất cả những gì bạn cần làm là đây!
George Harnwell

15

Phương pháp này là cách đơn giản nhất để người mới bắt đầu kiểm soát kết xuất Bố cục trong ứng dụng ASP.NET MVC của bạn. Chúng tôi có thể xác định bộ điều khiển và hiển thị Bố cục dưới dạng bộ điều khiển, để thực hiện điều này, chúng tôi có thể viết mã của mình trong tệp _ViewStart trong thư mục gốc của thư mục Lượt xem. Sau đây là một ví dụ cho thấy làm thế nào nó có thể được thực hiện.

@{
    var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
    string cLayout = "";

    if (controller == "Webmaster")
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
    else
        cLayout = "~/Views/Shared/_Layout.cshtml";

    Layout = cLayout;
}

Đọc bài viết hoàn chỉnh tại đây "Cách kết xuất bố cục khác nhau trong ASP.NET MVC"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.