【问题标题】:How to create an extension method on IHtmlHelper<dynamic>如何在 IHtmlHelper<dynamic> 上创建扩展方法
【发布时间】:2015-05-19 13:56:30
【问题描述】:

This article 展示了如何在 HtmlHelper&lt;dynamic&gt; 上创建扩展方法,但它似乎不适用于 MVC6(我将 HtmlHelper 更改为 IHtmlHelper)。

错误是:

'IHtmlHelper<PagedList<Tag>>' does not contain a definition for 'CustomSelectList' and the best extension method overload 'HtmlHelperExtensions.CustomSelectList<Tag>(IHtmlHelper<dynamic>, string, IEnumerable<Tag>, Func<Tag, string>, Func<Tag, string>)' requires a receiver of type 'IHtmlHelper<dynamic>'

这在 MVC6 中是如何完成的?

【问题讨论】:

  • 您的 cmets 谈论 IHtmlHelper&lt;dynamic&gt;,而您的错误消息指定 IHtmlHelper&lt;PagedList&lt;Tag&gt;&gt;。除非您为您的模型使用 dynamic(通过不指定 @model 指令),否则您需要使您的辅助方法通用。
  • @MattDeKrey,如果我将其设为泛型,泛型类型会是模型的类型吗?我真正想要的是能够在 PagedList 中使用Tag 类型。比如:@model PagedList&lt;Tag&gt;,然后是@Html.OrderByLinkFor(t =&gt; t.Name)(其中tTag 而不是PagedList&lt;Tag&gt;)。这可能吗?

标签: html-helper asp.net-core asp.net-core-mvc


【解决方案1】:

扩展方法需要在IHtmlHelper而不是HtmlHelper&lt;dynamic&gt;

public static HtmlString CustomSelectList<T>(
    this IHtmlHelper html,
    string selectId,
    IEnumerable<T> list,
    Func<T, string> getName,
    Func<T, string> getValue)
{
    StringBuilder builder = new StringBuilder();
    builder.AppendFormat("<select id=\"{0}\">", selectId);
    foreach (T item in list)
    {
        builder.AppendFormat("<option value=\"{0}\">{1}</option>",
            getValue(item),
            getName(item));
    }
    builder.Append("</select>");
    return new HtmlString(builder.ToString());
}

用法:

@(Html.CustomSelectList<Tag>("myId", Model, t => t.Name, t => t.Id.ToString()))

【讨论】:

  • 这些信息来自哪里?我一直看到HtmlHelper 被使用过,我似乎在IHtmlHelper 上找不到任何信息。当然,我无法建立对它的任何引用。
猜你喜欢
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2022-06-11
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多