2008-11-29 36 views
9

Tôi đang cố gắng tìm hiểu cách sử dụng usercontrols trong asp.net mvc. Tôi biết cách thêm một usercontrol vào một khung nhìn và cách truyền dữ liệu cho nó. Những gì tôi đã không thể tìm ra là làm thế nào để bạn làm điều này mà không cần phải lấy và truyền dữ liệu trong mỗi bộ điều khiển duy nhất? Ví dụ: nếu tôi có điều khiển người dùng hiển thị các bài đăng gần đây nhất trên một số nhưng không phải tất cả các trang trong trang web, làm cách nào để viết Bộ điều khiển để tôi nhận dữ liệu cho người dùng đó kiểm soát và chuyển cho người dùng kiểm soát từ chỉ một nơi trong trang web thay vì nhận và truyền dữ liệu trong mỗi bộ điều khiển khác nhau mà người dùng điều khiển được sử dụng?Làm thế nào để bạn sử dụng usercontrols trong asp.net mvc hiển thị một "hòn đảo" của dữ liệu?

Tôi không chắc liệu điều này có hợp lý hay không. Có cách nào tốt hơn hoặc được đề xuất để xử lý "hòn đảo" dữ liệu mà bạn muốn hiển thị trên một số trang không?

Tôi đến từ các biểu mẫu web nơi tôi chỉ có thể viết điều khiển người dùng có dữ liệu của riêng mình và hiển thị dữ liệu độc lập với phần còn lại của bất kỳ trang nào được sử dụng.

Trả lời

11

Có nhiều cách để thực hiện.

Cách tiếp cận cơ bản là

  • Điền vào dữ liệu cho các quan điểm trong (sự kiện OnActionExecuting) BaseController
  • Viết một bộ lọc hành động tùy chỉnh
  • Viết một điều khiển ứng dụng (các ví dụ. Là ở dưới đây liên kết).

Một ví dụ về OnActionExecuting sẽ

[HandleError] 
    public class BaseController : Controller 
    { 
     CourseService cs = new CourseService(); 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      List<Tag> tags = cs.GetTags(); 
      ViewData["Tags"] = tags; 
     } 

    } 

Bạn có thể sử dụng "thẻ" xem dữ liệu trên bất kỳ quan điểm. Đây chỉ là một ví dụ về usercontrol được hiển thị dưới dạng nội dung phụ.

<div id="sidebar_b"> 
     <asp:ContentPlaceHolder ID="ContentReferenceB" runat="server" > 
      <% Html.RenderPartial("Tags"); %> 
     </asp:ContentPlaceHolder> 
    </div> 

Tôi nhận thấy URL sau hữu ích.

http://weblogs.asp.net/stephenwalther/archive/2008/08/12/asp-net-mvc-tip-31-passing-data-to-master-pages-and-user-controls.aspx

http://blog.matthidinger.com/2008/02/21/ASPNETMVCUserControlsStartToFinish.aspx

http://www.aaronlerch.com/blog/2008/01/26/displaying-foo-on-every-page-of-an-aspnet-mvc-application/

http://blog.wekeroad.com/2008/01/07/aspnet-mvc-using-usercontrols-usefully/

+0

Bất kỳ suy nghĩ nào về cách thực hiện điều này với chế độ xem mạnh mẽ? –

+0

Nevermind, tôi chỉ cần đặt nó trong OnActionExecuted, mà làm việc tuyệt vời. –

0

Tái cấu trúc mã thu thập dữ liệu chế độ xem để người dùng này kiểm soát vào phương pháp riêng của nó, thậm chí có thể là mô hình riêng (lớp). Gọi phương thức này từ mỗi bộ điều khiển cần điền điều khiển và chuyển các kết quả trong ViewData bằng một khóa nổi tiếng. Bạn thậm chí có thể muốn chuyển kiểu của bộ điều khiển hiện tại cho phương thức của bạn trong trường hợp nó cần biết dữ liệu nào cần lấy dựa trên mô hình cơ sở cho bộ điều khiển.

ViewData["RecentPosts"] = RecentPosts.GetRecentPosts(this.GetType()); 

Trong kiểm soát của bạn, hãy truy xuất dữ liệu bằng khóa nổi tiếng.

+0

Có cách nào để thực hiện nó để bạn không cần thực hiện cuộc gọi lớp/phương thức trong mỗi bộ điều khiển sẽ chuyển dữ liệu đến chế độ xem giữ quyền kiểm soát của người dùng không? – dtc

+0

Không thực sự - bạn phải lấy dữ liệu được điền trong ViewData bằng cách nào đó. @ Rajesh của câu trả lời có một số gợi ý về làm cho nó dễ dàng hơn bằng cách bắt nguồn từ bộ điều khiển của bạn từ một lớp cơ sở mà thực hiện điều này cho tất cả các bộ điều khiển con. – tvanfosson

0
+0

Bạn có thể kiểm tra cách tiếp cận ở trên mà tôi đã đánh dấu cho nội dung phụ. Trong thực tế, tôi đang sử dụng "Thẻ" như một nội dung phụ. Bạn có thể có một "usercontrol" bên lề và điền dữ liệu của nó vào bộ điều khiển cơ sở để nó có sẵn khi được yêu cầu. –

3

Trong tương lai MVC, có sẵn trên codeplex, chứa các phần mở rộng RenderAction HtmlHelper.Điều này sẽ cho phép bạn tạo một bộ điều khiển cho điều khiển ueser và bộ điều khiển này sẽ điền vào ViewData được sử dụng bởi điều khiển người dùng mà không cần phải dùng đến bộ điều khiển cơ sở như được đề xuất.

Trong Xem bạn sẽ làm gì

<% Html.RenderAction("Index", "UserControlController") %> 

hoặc một trong những quá tải khác.

Thao tác này sẽ tạo một thể hiện của bộ điều khiển, thực hiện phương thức và hiển thị chế độ xem điều khiển người dùng vào chế độ xem chính. Bộ điều khiển xem chính không cần biết bất kỳ điều gì về điều khiển người dùng hoặc mô hình/dữ liệu của nó.

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