2008-10-16 6 views
198

Làm cách nào để có chế độ xem hiển thị một phần (điều khiển người dùng) từ một thư mục khác? Với bản xem trước 3 tôi đã sử dụng để gọi RenderUserControl với đường dẫn đầy đủ, nhưng whith nâng cấp để xem trước 5 điều này là không thể nữa. Thay vào đó chúng ta có phương thức RenderPartial, nhưng nó không cung cấp cho tôi chức năng mà tôi đang tìm kiếm.Hiển thị một phần từ thư mục khác (không được chia sẻ)

Trả lời

370

Chỉ cần bao gồm đường dẫn đến chế độ xem, với phần mở rộng của tệp.

Razor:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes) 

ASP.NET động cơ:

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %> 

Nếu đó không phải là vấn đề của bạn, bạn có thể vui lòng cung cấp mã của bạn được sử dụng để làm việc với các RenderUserControl?

+13

Tôi muốn chúng tôi chỉ có thể nói/AnotherFolder/Tin nhắn –

+4

@Simon_Weaver Bạn có thể đạt được điều đó. Một cách sẽ là sửa đổi ViewEngine và ghi đè lên phương thức 'FindPartialView' của nó với một cái gì đó như' if (partialViewName.Contains "/") partialViewName = "~/Views /" + partialViewName; ' –

+2

Làm việc trong công cụ MVC 3 Razor, nhưng như trên, bạn cần phần mở rộng (.cshtml). – Chris

3

VirtualPathProviderViewEngine, mà trên đó WebFormsViewEngine dựa trên, được cho là hỗ trợ các ký tự "~" và "/" ở phía trước đường dẫn để các ví dụ trên của bạn hoạt động.

Tôi nhận thấy các ví dụ của bạn sử dụng đường dẫn "~/Account/myPartial.ascx", nhưng bạn đã đề cập rằng điều khiển người dùng của bạn nằm trong thư mục Chế độ xem/Tài khoản. bạn đã thử

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

hoặc là chỉ là một lỗi đánh máy trong câu hỏi của bạn?

6

Đối với một điều khiển người dùng có tên myPartial.ascx nằm tại Lượt xem/Tài khoản thư mục ghi như thế này:

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%> 
0

bạn nên cố gắng này

~/Views/Shared/parts/UMFview.ascx 

nơi ~/Views/ trước khi mã của bạn

-4

Thử sử dụng RenderAction("myPartial","Account");

+3

Vui lòng đọc câu hỏi khi người dùng hỏi về chế độ xem trong thư mục khác nhau ở đâu là thư mục trong mã của bạn? – Pamma

3

Tôi đã tạo một cách giải quyết dường như hoạt động khá tốt. Tôi tìm thấy sự cần thiết phải chuyển sang bối cảnh của một bộ điều khiển khác nhau cho tra cứu tên hành động, xem tra cứu, vv Để thực hiện điều này, tôi đã tạo ra một phương pháp khuyến nông mới cho HtmlHelper:

public static IDisposable ControllerContextRegion(
    this HtmlHelper html, 
    string controllerName) 
{ 
    return new ControllerContextRegion(html.ViewContext.RouteData, controllerName); 
} 

ControllerContextRegion được định nghĩa là:

internal class ControllerContextRegion : IDisposable 
{ 
    private readonly RouteData routeData; 
    private readonly string previousControllerName; 

    public ControllerContextRegion(RouteData routeData, string controllerName) 
    { 
     this.routeData = routeData; 
     this.previousControllerName = routeData.GetRequiredString("controller"); 
     this.SetControllerName(controllerName); 
    } 

    public void Dispose() 
    { 
     this.SetControllerName(this.previousControllerName); 
    } 

    private void SetControllerName(string controllerName) 
    { 
     this.routeData.Values["controller"] = controllerName; 
    } 
} 

cách này được sử dụng trong vòng một cái nhìn như sau:

@using (Html.ControllerContextRegion("Foo")) { 
    // Html.Action, Html.Partial, etc. now looks things up as though 
    // FooController was our controller. 
} 

có thể có tác dụng phụ không mong muốn cho này nếu mã của bạn đòi hỏi sự controller thành phần tuyến đường không thay đổi, nhưng trong mã của chúng tôi cho đến nay, dường như không có bất kỳ âm bản nào đối với phương pháp này.

18

Trong trường hợp của tôi, tôi đã sử dụng MvcMailer (https://github.com/smsohan/MvcMailer) và muốn truy cập một phần xem từ một thư mục khác, không nằm trong "Được chia sẻ". Các giải pháp trên không hiệu quả, nhưng sử dụng đường dẫn tương đối đã làm.

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject) 
+0

Tương tự như vậy @ Html.Partial ("../ Shared/_PartialView") để sử dụng thư mục Chia sẻ. –

+6

Tôi thấy rằng điều này không hoạt động nếu không có phần mở rộng .cshtml ở cuối. – Luke

18

Nếu bạn đang sử dụng đường dẫn khác này rất nhiều lần bạn có thể khắc phục vĩnh viễn mà không phải chỉ định đường dẫn mọi lúc. Theo mặc định, nó đang kiểm tra xem một phần trong thư mục View và trong thư mục Shared. Nhưng nói rằng bạn muốn thêm một.

Thêm một lớp vào thư mục Models của bạn:

public class NewViewEngine : RazorViewEngine { 

    private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] { 
     "~/Views/Foo/{0}.cshtml", 
     "~/Views/Shared/Bar/{0}.cshtml" 
    }; 

    public NewViewEngine() { 
     // Keep existing locations in sync 
     base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray(); 
    } 
} 

Sau đó, trong tập tin Global.asax.cs của bạn, thêm dòng sau:

ViewEngines.Engines.Add(new NewViewEngine()); 
+3

Tất nhiên tôi nhận ra câu hỏi này đã được hỏi từ lâu rồi. Tôi nghĩ rằng tôi sẽ bổ sung nó cho các nhân viên của Google trong tương lai và Bingers trong tương lai. – Paul