【问题标题】:Cannot understand how this Func<in T, out T> should work with Url.Action delegate无法理解此 Func<in T, out T> 应如何与 Url.Action 委托一起使用
【发布时间】:2014-01-24 03:36:06
【问题描述】:
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x }))

我有这个想法,我想再添加 2 个属性(所以我向 Func 委托添加了更多参数...):

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List",
    new { page = x, 
          sort = Request.QueryString["sort"], 
          desc = Request.QueryString["desc"] }))

但是当我再添加 2 个属性时,它不起作用......我在这里不明白什么?

我有以下 html 助手:

public static MvcHtmlString PageLinks(this HtmlHelper html,
    PagingInfo pagingInfo, Func<int, string, string, string> pageUrl)
{
    StringBuilder result = new StringBuilder();
    for (int i = 1; i <= pagingInfo.TotalPages; i++)
    {
        TagBuilder liTag = new TagBuilder("li"); 
        TagBuilder aTag = new TagBuilder("a"); 

        aTag.MergeAttribute("href", pageUrl(i, 
           pagingInfo.Sort, pagingInfo.Desc.ToString())); // pageUrl delegate is here helloooo
        aTag.InnerHtml = i.ToString();
        if (i == pagingInfo.CurrentPage)
            liTag.AddCssClass("active");

        liTag.InnerHtml = aTag.ToString();

        result.Append(liTag.ToString());
    }
    return MvcHtmlString.Create(result.ToString());
}

P.S 我的控制器是这样的:

public ViewResult List(int page = 1, string sort = "Name", bool desc = false)
{...

【问题讨论】:

    标签: c# razor html-helper asp.net-mvc-5


    【解决方案1】:

    x => Url.Action("List",
       new { page = x, 
          sort = Request.QueryString["sort"], 
          desc = Request.QueryString["desc"] })
    

    仍然是一个 lambda 表达式,表示一个需要 one 参数的方法。在方法主体中创建具有三个属性的匿名对象这一事实无关紧要。

    你想把它改成

    (x, y, z) => Url.Action("List",
       new { page = x, 
          sort = y, 
          desc = z }))
    

    当你调用它时这样

    pageUrl(i, pagingInfo.Sort, pagingInfo.Desc.ToString())
    

    所有三个(ipagingInfo.SortpaginginInfo.Desc.ToString())都将被连续参数(xyz)捕获。为了清楚起见,我什至建议重命名:

    (pageNumber, sortOrder, descending) => Url.Action("List",
       new { page = pageNumber, sort = sortOrder, desc = descending }))
    

    【讨论】:

    • 天哪,你真是个天才。真是个了不起的人! Yehaaaa,微笑2 maxage!如何将值推送到委托函数中?即... Request.QueryString...
    • +1 这是一个很好的解释,但考虑使用像 PagingParameters option - Func&lt;T1,T2,T3,TR&gt; 这样的单个参数,遗憾的是没有提供关于参数含义的良好文档,特别是如果大多数参数属于同一类型。跨度>
    • @AlexeiLevenkov:我一直在更新我的答案,建议在您发表评论时重命名参数。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多