准备一个在定义 lambda 之前引用 lambda 变量的对象

本文关键字:lambda 引用 变量 对象 定义 一个 | 更新日期: 2024-11-06 06:34:34

此帮助程序输出分页:

@Html.BootstrapPager( 
    int.Parse( Request.Params[ "page" ] ), 
    index => Url.Action( 
        "List", 
        "Test", 
        new { 
            page = index, 
            amount = 10, 
            sort = Request.Params[ "sort" ], 
            order = Request.Params[ "order" ] 
        } 
    ),
    Model.PaginationSet.TotalItemCount, 
    numberOfLinks: 10 
) 

BootstrapPager函数的第二个参数是 lambda。index变量引用输出页码的内部循环。

您能想到什么方法可以让我预先准备作为仍然引用 lambda index变量的 Url.Action 的第 3 个参数传入的对象?

它可能看起来像这样:

object myActionData = new { 
    page = <index>, // I don't know how this line would work
    amount = 10, 
    sort = Request.Params[ "sort" ], 
    order = Request.Params[ "order" ] 
}    
@Html.BootstrapPager( 
    int.Parse( Request.Params[ "page" ] ), 
    index => Url.Action( 
        "List", 
        "Test", 
        myActionData        
    ),
    Model.PaginationSet.TotalItemCount, 
    numberOfLinks: 10 
) 

准备一个在定义 lambda 之前引用 lambda 变量的对象

这是不可能的,在这里有一个 lambda 的全部意义在于,在有效调用 lambda 之前没有设置index

你能做的最好的事情就是事先声明工厂函数。

@{
    Func<int, object> myActionDataFactory = index => new { 
        page = index, // Here we use the parameter
        amount = 10, 
        sort = Request.Params[ "sort" ], 
        order = Request.Params[ "order" ] 
    };
}
@Html.BootstrapPager( 
    int.Parse( Request.Params[ "page" ] ), 
    index => Url.Action( 
        "List", 
        "Test", 
        myActionDataFactory(index)
    ),
    Model.PaginationSet.TotalItemCount, 
    numberOfLinks: 10 
) 

同样,您可以从 BootstrapPager 调用中删除整个 lambda。

@{
    Func<int, sting> myUrlFactory = index => Url.Action( 
            "List", 
            "Test",
            new { 
                page = index, // Here we use the parameter                
                amount = 10, 
                sort = Request.Params[ "sort" ], 
                order = Request.Params[ "order" ] 
            });
}
@Html.BootstrapPager( 
    int.Parse( Request.Params[ "page" ] ), 
    myUrlFactory,
    Model.PaginationSet.TotalItemCount, 
    numberOfLinks: 10 
)

您甚至可以将 Url 工厂声明为在代码中其他位置声明的(大概是静态的)类的方法。