7

Tôi hiện đang cố gắng để di chuyển một dự án ASP.net MVC 5 đến MVC 6.Làm cách nào để xác định các phần có nội dung mặc định trong MVC 6?

Làm thế nào tôi sẽ di chuyển đoạn mã sau:

public static class SectionExtensions 
{ 
    public static HelperResult RenderSection(this WebPageBase webPage, [RazorSection] string name, Func<dynamic, HelperResult> defaultContents) 
    { 
     return webPage.IsSectionDefined(name) ? webPage.RenderSection(name) : defaultContents(null); 
    } 
} 

[RazorSection] là một phần của hội đồng JetBrains.Annotations.

Trả lời

6

Thay vì WebPageBase tôi đã sử dụng RazorPage trong Microsoft.AspNet.Mvc.Razor

namespace Stackoverflow 
{ 
    public static class SectionExtensions 
    { 
     public static IHtmlContent RenderSection(this RazorPage page, [RazorSection] string name, Func<dynamic, IHtmlContent> defaultContents) 
     { 
      return page.IsSectionDefined(name) ? page.RenderSection(name) : defaultContents(null); 
     } 
    } 
} 

Sau đó tham khảo các lớp trong dao cạo trang @using static Stackoverflow.SessionExtensions, và gọi nó là như vậy:

@this.RenderSection("extra", @<span>This is the default!</span>)) 

Một thay thế cách sẽ được chỉ làm điều này trong chế độ xem (Tôi thích cách này, có vẻ đơn giản hơn rất nhiều):

@if (IsSectionDefined("extra")) 
{ 
    @RenderSection("extra", required: false) 
} 
else 
{ 
    <span>This is the default!</span> 
} 

Tôi hy vọng điều này sẽ hữu ích.

Cập nhật 1 (từ bình luận)

bằng cách tham khảo namespace

@using Stackoverflow 

bạn không cần phải bao gồm các từ khóa static, nhưng khi gọi nó, bạn sẽ phải tham khảo thực tế trong không gian tên và cũng chuyển '' 'này vào hàm.

@SectionExtensions.RenderSection(this, "extra", @<span>This is the default!</span>) 

Cập nhật 2

Có một lỗi trong dao cạo mà không cho phép bạn gọi mẫu đại biểu Func <dynamic, object> e = @<span>@item</span>; trong vòng một phần. Xin vui lòng xem https://github.com/aspnet/Razor/issues/672

Một cách giải quyết hiện tại:

public static class SectionExtensions 
{ 
    public static IHtmlContent RenderSection(this RazorPage page, [RazorSection] string name, IHtmlContent defaultContents) 
    { 
     return page.IsSectionDefined(name) ? page.RenderSection(name) : defaultContents; 
    } 
} 

và sau đó trang dao cạo:

section test { 
    @this.RenderSection("extra", new HtmlString("<span>this is the default!</span>")); 
} 
+0

Cảm ơn đã phản ứng. Tôi không thích cách thay thế đơn giản chỉ vì tôi muốn giữ các câu lệnh bên ngoài khung nhìn. Tôi đã thử những gì bạn đã đề cập và mọi thứ dường như hoạt động ngoại trừ không gian tên. Có vẻ như tôi phải sử dụng: SectionExtensions.RenderSection thay vì this.RenderSection. Tuyên bố sử dụng dường như không làm gì cả? –

+0

Tôi đã cập nhật câu trả lời của mình, vì một số lý do mà chỉnh sửa trước đó của tôi không được thực hiện. Để tham chiếu một lớp tĩnh trực tiếp, bạn sẽ phải sử dụng từ khóa tĩnh ví dụ. '@using static Stackoverflow.SessionExtensions', tuy nhiên nếu bạn chỉ tham chiếu không gian tên, bạn không phải thêm ví dụ tĩnh. '@using Stackoverflow'. Tất cả đều phụ thuộc nếu bạn muốn bao gồm toàn bộ không gian tên vào chế độ xem của mình. Trong trường hợp đó, bạn phải gọi '@ SessionExtension.RenderSection' thay vì '@ this.RenderSection' và sau đó chuyển 'this' vào hàm RenderSection (this, "test", @ mặc định). Hãy cho tôi biết nếu nó giúp được bạn. –

+0

Tôi nghĩ rằng điều này đã được làm việc nhưng tôi đã chạy vào một vấn đề. Giả sử bạn có bố cục lồng nhau.Trong MasterLayout bạn có một @RenderSection tiêu chuẩn ("test", false). Sau đó, bạn có một SubMasterLayout thừa hưởng MasterLayout. Nếu tôi cố gắng kiểm tra @section { @ SectionExtensions.RenderSection (this, "thêm", @ Đây là mặc định!) } tôi nhận được ngoại lệ sau đây: '__razor_template_writer': một tham số hoặc biến địa phương không thể có cùng tên với tham số kiểu phương thức. Điều này làm việc hoàn hảo trong MVC5? –

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