2015-05-19 2 views
3

This article показывает, как создать метод расширения на HtmlHelper<dynamic>, но он не появляется на работе с MVC6 (я изменил HtmlHelper к IHtmlHelper).Как создать метод расширения на IHtmlHelper <dynamic>

Ошибка:

'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?

+0

Ваши комментарии говорят о '' IHtmlHelper , в то время как ваше сообщение об ошибке указывает 'IHtmlHelper >'. Если вы не используете 'dynamic' для своей модели (не указывая директиву' @ model'), вам нужно сделать свой вспомогательный метод общим. –

+0

@MattDeKrey, если я сделаю его общим, будет ли тип типа типом модели? То, что я действительно хотел, - это возможность использовать тип «Tag» в PagedList. Итак, что-то вроде: '@model PagedList ', а затем '@ Html.OrderByLinkFor (t => t.Name)' (где 't' -' Tag', а не 'PagedList '). Это возможно? – darkangel

ответ

7

Способ расширения должен быть на IHtmlHelper, а не на HtmlHelper<dynamic>.

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())) 
+0

Где эта информация? Я всегда видел, что используется HtmlHelper, и я не могу найти никакой информации о 'IHtmlHelper'. Конечно, я не могу установить никаких ссылок на него. –

Смежные вопросы