ASP.NET MVC 3 Hàm đệ quy Razor


76

Được rồi, vì vậy tôi muốn hiển thị một danh sách chứa danh sách các danh sách ...

Tôi không có cách nào để biết có bao nhiêu cấp độ để hiển thị, vì vậy tôi đã tìm ra đây là nơi tôi phá vỡ quy trình đệ quy cũ.

Tôi đang gặp khó khăn với cách thực hiện chính xác vấn đề này.

Đây là những gì tôi có cho đến nay (theo quan điểm - đơn giản hóa):

@foreach(MyObject item in @Model.ListOfObjects){ 
    <div> @item.Title </div>
    //Call recursive function?
}

Bây giờ mỗi đối tượng này cũng có một Danh sách <MyObject>. Tôi muốn hiển thị từng cấp bên dưới div này, chẳng hạn như thụt lề tab cho mỗi cấp.

Tôi đã nghĩ rằng một chức năng Razor sẽ là điều cần làm ở đây, nhưng tôi cần một số trợ giúp để hình thành nó. Đây là suy nghĩ của tôi:

@functions{
    public static void ShowSubItems(MyObject _object){
         if(_object.ListOfObjects.Count>0){
             foreach(MyObject subItem in _object.listOfObjects){

                 // Show subItem in HTML
                 ShowSubItems(subItem);
             }
         }
     }
 }

Nhưng như bạn thấy, tôi rõ ràng cần một số trợ giúp :)

Câu trả lời:


206

Công cụ chế độ xem Razor cho phép viết trình trợ giúp đệ quy nội tuyến với @helpertừ khóa.

@helper ShowTree(IEnumerable<Foo> foos)
{
    <ul>
        @foreach (var foo in foos)
        {
            <li>
                @foo.Title
                @if (foo.Children.Any())
                {
                    @ShowTree(foo.Children)
                }
            </li>
        }
    </ul>
}

5
một điều còn lại là nó phải được @ShowTree (Foos) xem
vicky

1
Điều này thực sự hoạt động tốt. Cũng có thể có ý nghĩa khi đề cập đến stackoverflow.com/questions/12943245/… để tham chiếu các biến cục bộ trên trang cshtml.
Travis J

làm thế nào có thể được thực hiện mã này trong asp.net lõi 2? trong asp.net lõi 2, không có @helper
Roohullah Allem cho biết

2
@Jahan Có vẻ như @helperđã biến mất trong ASP.NET Core. Các hàm nội tuyến là một thay thế tiềm năng: github.com/aspnet/Razor/issues/715#issuecomment-272890766 nhưng trông khó đọc hơn nhiều!
Paolo Moretti

@PaoloMoretti Khi tôi định nghĩa nó là Func đệ quy, tôi có thể làm như thế nào? Tôi muốn tạo một bình luận lồng nhau bằng Hàm đệ quy. Lỗi này hiển thị trong VS2018 IDE: "Việc sử dụng biến cục bộ chưa được gán 'FunctionName', biến cục bộ 'FunctionName' có thể không được khởi tạo trước khi truy cập"
Roohullah Allem cho biết

13

Tôi nghĩ tốt nhất là tạo một trình trợ giúp HTML cho việc này. Một cái gì đó như thế này:

public static string ShowSubItems(this HtmlHelper helper, MyObject _object)
{
     StringBuilder output = new StringBuilder();
     if(_object.ListOfObjects.Count > 0)
     {
         output.Append("<ul>");

         foreach(MyObject subItem in _object.listOfObjects)
         {
             output.Append("<li>");
             output.Append(_object.Title);
             output.Append(html.ShowSubItems(subItem.listOfObjects);
             output.Append("</li>")
         }
         output.Append("</ul>");
     }
     return output.ToString();
}

Sau đó gọi nó như thế này:

@foreach(MyObject item in @Model.ListOfObjects){
    <div> @item.Title </div>
    @html.ShowSubItems(item)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.