2011-02-01 46 views
7

Tôi đang đấu tranh với những gì có vẻ là một khái niệm rất đơn giản. Nếu tôi có một giá trị trong ViewBag dự định để sử dụng bởi _Layout.cshtml của tôi, làm thế nào và ở đâu để tôi đặt giá trị đó?Phương pháp tiếp cận để xử lý dữ liệu chung trong khung nhìn ASP.NET MVC 3

Dưới đây là rõ ràng nhất (với tôi) tùy chọn như tôi đang nhìn thấy chúng:

  1. Đặt giá trị trong mỗi bộ điều khiển (không DRY)
  2. Tạo cơ sở điều khiển của riêng tôi kế thừa từ điều khiển và thiết lập giá trị trong lớp cơ sở
  3. đặt giá trị trong Global.asax.cs (cảm thấy bẩn)
  4. Tạo một ActionFilter để thiết lập dữ liệu và đăng ký bộ lọc trên toàn cầu (còn cảm thấy sai)
  5. đặt giá trị trong _ViewStart.cshtml (feels RẤT sai và rất bẩn)

Ví dụ:

_Layout.cshtml


<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
    <div id="header"> 
     <h1>Welcome @ViewBag.UserName</h2> 
    </div> 
    <div id="content"> 
     @RenderBody() 
    </div> 
</body> 
</html> 

Nếu mỗi bộ điều khiển đặt giá trị UserName, đó không phải là khủng khiếp KHÔ. Nếu tôi đã giải quyết vấn đề này với một cái gì đó như CodeIgniter, tôi chỉ cần tạo ra bộ điều khiển cơ bản của riêng mình để xử lý những thứ phổ biến này và đi theo con đường vui vẻ của tôi. Có một lựa chọn ưa thích hơn với ASP.NET MVC 3?

+0

thực sự, trong trường hợp cụ thể này - tôi đoán "Tên người dùng" sẽ thực sự đến từ vé xác thực phiên/biểu mẫu. Vì vậy, bạn có thể muốn sử dụng một trình trợ giúp HTML sử dụng mã FormsAuth để lấy Tên người dùng ra khỏi cookie và hiển thị một MvcHtmlString - chỉ là một ý tưởng ... – RPM1984

+0

Hmmm ... điểm tốt. Có lẽ @ ViewBag.UserName không phải là ví dụ tốt nhất. Tôi thực sự quan tâm đến bức tranh lớn hơn vào lúc này. – Greg

+0

@ RPM1984: nó không quan trọng đối với quan điểm rằng "Tên người dùng" đến từ hình thức xác thực. Nó sẽ được thông qua trong (ViewBag hoặc cách khác). Chế độ xem sẽ không bao giờ "tìm nạp" bất kỳ thứ gì. Xem xét các kịch bản thử nghiệm là tốt, bạn muốn chuyển dữ liệu giả vào chế độ xem để kiểm tra đơn vị. Không thể nếu chế độ xem của bạn là "tìm nạp" mọi thứ. Ngoài ra khá nhiều invalidates toàn bộ các điểm của MVC pattern.Not chọn trên bạn, nhưng tôi đã chỉ nhìn thấy loại tâm lý lặp đi lặp lại trong bài viết MVC khác nhau (bao gồm cả mẫu dự án MVC mặc định!) – Roger

Trả lời

10

Mô hình chế độ xem chung và bộ điều khiển cơ sở là cách để đi IMO. Sử dụng mô hình chế độ xem chung làm lớp cơ sở cho tất cả các kiểu xem của bạn. Sử dụng phương thức OnActionExecuted trong bộ điều khiển cơ sở để lấy mô hình khung nhìn (cho một hành động trả về một khung nhìn) và đưa nó vào mô hình khung nhìn chung. Đặt các thuộc tính phổ biến tại thời điểm đó.

+0

Groovy. Vui mừng khi biết tôi không hoàn toàn rời khỏi căn cứ. – Greg

+1

Tôi chỉ biết giao dịch Sith trong tuyệt đối, nhưng đây là câu trả lời đúng duy nhất. Khung nhìn chỉ được đọc từ mô hình và chỉ bộ điều khiển mới có thể ghi vào mô hình. Nếu bạn đang gắn bó với các mô hình đánh máy mạnh mẽ, bạn sẽ muốn có một mô hình cơ bản cũng như một bộ điều khiển cơ sở. – Roger

+1

@tvanfossen. Đây là một cách tiếp cận thú vị và tôi đang dùng thử nó. Một câu hỏi - tôi có thể sử dụng ActionFilter thay vì một bộ điều khiển cơ sở và móc vào 'OnActionExecuted'? Tôi cần phải vượt qua dữ liệu chung nhưng chỉ trên các hành động cụ thể và do đó suy nghĩ decoratin những người có bộ lọc sẽ tốt hơn. –

0

Giả sử tôi muốn có ViewBag.PageHeight có giá trị mặc định là 1000 cho tất cả các trang nhưng sau đó cho phép điều đó bị ghi đè bởi bất kỳ trang/chế độ xem nào. Đây là những gì tôi đặt trong _Layout.cshtml:

Chiều cao trang là @ (ViewBag.PageHeight ?? 1000)

Điều này có vẻ hiệu quả.

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