2009-08-28 38 views
9

Nếu tôi có HomeController hiển thị chế độ xem Chỉ mục của nó, tôi sẽ tiến hành như thế nào để có chế độ xem Chỉ mục được gắn một UserControl từ một Bộ điều khiển khác?Cách hiển thị partials từ một Bộ điều khiển khác

Dưới đây là một cái nhìn tại các nội dung của Home/Index Xem:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    <%=Resources.Global.HomeTitle %> 
</asp:Content> 

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2><%= Html.Encode(ViewData["Message"]) %></h2> 
    <p><%=Resources.Global.HomeIndex %></p> 

    <h3>Partial title</h3> 
    <% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %> 

</asp:Content> 

Dưới đây là nội dung OtherController:

public class OtherController : BaseController 
{ 
    private readonly IRepositoryContract<SomeType> repo = new SomeTypeRepository(); 

    public ActionResult SomeAction() 
    { 
     IQueryable<SomeType> items = repo.GetAllItems(); 
     return View("SomeAction", items); 
    } 
} 

này mang lại cho tôi một NullReferenceException từ Controller là không bao giờ được gọi bằng các Phương thức RenderPartial(). Thay đổi dòng sau

<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx"); %> 

của thành viên này

<% Html.RenderPartial("~/Views/OtherController/SomeAction.ascx",((ViewResult) new OtherController().SomeAction()).ViewData.Model); %> 

công trình, nhưng nó chắc chắn là xấu xí như địa ngục. Có phải là một cách tốt hơn để imbed partials từ bộ điều khiển khác?

Cập nhật :: Giải pháp phát hiện

Dưới đây là đoạn code sau khi thực hiện Adrian Grigore 's giải pháp: partials

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<%@ Import Namespace="Microsoft.Web.Mvc"%> 

    <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
     <%=Resources.Global.HomeTitle %> 
    </asp:Content> 

    <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
     <h2><%= Html.Encode(ViewData["Message"]) %></h2> 
     <p><%=Resources.Global.HomeIndex %></p> 

     <h3>Partial title</h3> 
     <% Html.RenderAction("SomeAction","OtherController"); %> 

    </asp:Content> 

Trả lời

5

Sử dụng phương thức Html.RenderAction từ thư viện ASP.NET MVC Futures.

+0

Điều đó hoạt động tuyệt vời! Cảm ơn ngài. Tôi đã thay đổi <% Html.RenderPartial ("~/Views/OtherController/SomeAction.ascx"); %> line by <% Html.RenderAction ("SomeAction", "OtherController"); %> và nó hoạt động tự hỏi, gọi OtherController và hiển thị dữ liệu chính xác. –

4

Đặt được sử dụng bởi nhiều hơn một bộ điều khiển vào thư mục đã chia sẻ.

Mô hình phải được chuyển bởi trang. Xây dựng nó trong bộ điều khiển, không phải trong khung nhìn. Sau đó, vượt qua nó như thế này:

<% Html.RenderPartial("SomeAction", Model.SomeActionData); %> 

Lưu ý rằng nếu Model.SomeActionData là null, thì MVC sẽ chuyển mô hình thay vì Model.SomeActionData. Đảm bảo mã của bạn có thể chịu đựng được điều đó.

+0

Bạn có nghĩa là tôi sẽ phải lặp lại (hoặc thừa kế) các logic xây dựng mô hình trong mỗi bộ điều khiển mà phần nào được chia sẻ? Tôi hiểu rằng tôi có thể vượt qua ViewModel chứa thông tin được sử dụng bởi phần được chia sẻ đó cho chế độ xem Trang chủ/Chỉ mục, nhưng điều đó có nghĩa là tôi cần phải thêm/thêm dữ liệu này vào ViewModel của Chế độ xem khác bằng cách sử dụng phần này ... Nó sẽ có ý nghĩa hơn với tôi nếu có một cách để thực sự render partials trực tiếp từ bộ điều khiển khác, trong đó Model/ViewModel liên quan được thực hiện. –

+0

Không, bạn không bao giờ được sao chép mã. Đôi khi bạn cần phải modularize nó, mặc dù. Đề xuất của Adrian hoạt động tốt nếu bạn không ngại sử dụng Futures; gợi ý tôi đã làm việc nếu bạn muốn tránh nó. –

0

Có vẻ như bạn cần phải có UserControl được chia sẻ trong một trang chủ (có lẽ lồng nhau) để các Xem không cần phải biết về điều khiển khác hơn đó là cha mẹ. Stephen Walther có một vài chiến lược tốt cho truyền dữ liệu đến master pages and user controls.

  1. Mã-đằng sau trên trang chủ (BAD)
  2. ActionFilter
  3. Gọi một phần trực tiếp
  4. Tóm tắt các lớp điều khiển cơ sở
2

Bạn vẫn có thể sử dụng "một phần" trong trường hợp nếu bạn đặt chế độ xem của mình trong thư mục "Được chia sẻ".

Giải pháp này rất đơn giản và duy trì trong trường hợp nếu bạn đã chia sẻ quan điểm hay điều khiển, hy vọng nó cũng là một sự thay thế và hữu ích cho bạn ...

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