2009-03-31 35 views
6

Tôi đang cố gắng chuyển ViewData đến trang mastercam asp.net của tôi cho một usercontrol mvc mà tôi giữ trên trang chủ. Ví dụ, tôi tạo ra một danh sách thả xuống của tên như là một usercontrol mvc và tôi đặt nó trong masterpage của tôi.chuyển viewdata tới trang chủ asp.net mvc

Sự cố tôi đang gặp phải đang chuyển ViewData đến trang chính. Tôi tìm thấy bài viết này từ Microsoft trong đó có một giải pháp phong nha nhưng tôi đã tự hỏi nếu có khác "tốt hơn" giải pháp ra khỏi đó. Điều tôi không thích về giải pháp trong liên kết là tôi phải thay đổi mọi bộ điều khiển để kế thừa từ một lớp điều khiển mới.

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

Sửa: Vấn đề tôi đang xem xét là một thực tế rằng nếu tôi đặt một điều khiển người dùng trong masterpage của tôi dựa trên ViewData, tôi phải nhiều lần bao gồm rằng ViewData cho mỗi trang duy nhất sử dụng masterpage đã nói. Có thể giải pháp trong liên kết ở trên là giải pháp tốt nhất nhưng tôi đã hy vọng có các giải pháp thay thế khác.

Trả lời

1

Đối với những gì nó có giá trị, tôi đang sử dụng phương pháp này từ hướng dẫn rằng trong một dự án hiện tại và nó hoạt động rất tốt

Những gì bạn cũng có thể làm, nếu nó là dữ liệu có phần tĩnh (giống như một menu không thay đổi nhiều), là đặt đối tượng vào bộ đệm để cơ sở dữ liệu của bạn không được gọi cho mọi bộ điều khiển khởi tạo.

4

Trang chính đã có quyền truy cập vào Chế độ xem. Nếu bạn muốn gõ mạnh truy cập vào nó, bạn cần phải làm hai việc:

  1. Đặt những thứ trang chủ trong một lớp cơ sở (ví dụ CommonViewData)
  2. Bạn đã làm chủ trang kế thừa từ ViewMasterPage generic <> lớp:.

    "%>
+1

Vấn đề tôi đang xem là sự thật rằng nếu tôi đặt một điều khiển người dùng trong trang chủ dựa trên ViewData, tôi phải bao gồm ViewData đó cho mỗi trang sử dụng masterpage đã biết. – codette

0

Tôi không hoàn toàn nhận được vấn đề của bạn ...

Vấn đề tôi đang xem xét là một thực tế rằng nếu tôi đặt một điều khiển người dùng trong masterpage của tôi dựa trên ViewData, tôi phải lặp đi lặp lại bao gồm Chế độ xem đó cho mọi trang sử dụng trang cái đã nói.

Vâng vâng ... tất nhiên bạn làm. Nếu bạn có một usercontrol trong trang chủ của bạn thì tất nhiên bạn sẽ phải vượt qua các dữ liệu cần thiết cho usercontrol đó cho mỗi hành động & xem sử dụng masterpage đó.

Nó không giống như bạn phải lặp lại chính mình nếu bạn chỉ là kế thừa từ một bộ điều khiển cơ sở.

Sự cố của bạn có phải là một số trình điều khiển có các hành động vừa thực hiện vừa không gọi lượt xem xuất phát từ trang chủ cụ thể đó không? Vì vậy, do đó nếu bạn đang thực hiện một bộ điều khiển cơ sở, các hành động không sử dụng trang chủ cụ thể đó sẽ vẫn có chế độ xem cho nó ...? (Nếu tất cả điều đó có ý nghĩa ;-)

+0

Toàn bộ lý do tôi hỏi câu hỏi này là để xem liệu có các giải pháp thay thế cho giải pháp được cung cấp trong liên kết trong câu hỏi ban đầu của tôi hay không. Nhưng tôi đoán MS sẽ đăng giải pháp "tốt nhất" mà họ có thể đưa ra. – codette

2

Bạn có thể sử dụng phương pháp OnActionExecuting trên lớp bộ điều khiển cơ sở và điền dữ liệu chế độ xem vào đó không?

Cái gì như:

protected override void OnActionExecuting(ActionExecutingContext context) 
{ 
    context.Controller.ViewData.Model = GetDataForControl(); 
} 

Tôi đã không thử nó vì vậy nó chỉ là một suy nghĩ ...

1

Tôi thường sử dụng một lớp điều khiển trừu tượng cho MasterPage của tôi, nó là giải pháp tốt nhất, vì MasterPage giống như một "chế độ xem trừu tượng". Nhưng tôi ghi đè lên phương thức View() MasgerPageController để bao gồm các viewdata.

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages(); 
    return base.View(viewName, masterName, model); 
} 
+0

Sạch sẽ và đơn giản, cảm ơn! Bốn năm sau đó và cuối cùng đã có một upvote;) – statue

0

Tôi nghĩ giải pháp được đề xuất không hoạt động nhưng không phải là giải pháp lý tưởng. Nếu chúng ta đặt mã trong hàm tạo BaseController, nó sẽ được gọi ngay cả đối với các phương thức Hành động không có một MasterPages (ví dụ: các phương thức Post và các phương thức Ajax).
Tôi nghĩ một giải pháp tốt hơn (không lý tưởng) là gọi phương thức Html.Action trong trang Chính.

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