2016-10-24 4 views
1

Я играл с ядром asp.net и пытался перенести на него своих помощников. Я ввел свой собственный помощник в представления, но мне нужно было получить доступ к IHtmlHelper по умолчанию (я не хочу расширять HtmlHelper).Пользовательский помощник бритвы с IHtmlHelper reference

Итак, я построил свой конструктор таким образом, чтобы получить конкретный IHtmlHelper от IoC.

public FWHtmlHelper(IHtmlHelper htmlHelper) 
{ 
     this._htmlHelper = htmlHelper; 
} 

Дело в том, когда я попытался получить доступ помощника, я получил эту ошибку:

InvalidOperationException: Must call 'Contextualize' method before using this HtmlHelper instance.

Итак, как я могу создать свой собственный помощник и доступ к вспомогательному экземпляру View HTML?

* Редактировать, в соответствии с просьбой:

добавлен в контейнер

services.AddTransient(typeof(IFWHtmlHelper<>), typeof(FWHtmlHelper<>)); 

впрыскивается его в поле зрения

@inject IFWHtmlHelper<TModel> FWHtml 

Затем я создал расширение для моего помощника

public static TagBuilder Example<TModel, TValue>(this IFWHtmlHelper<TModel> fwHelper, Expression<Func<TModel, TValue>> expression) 
{} 
+0

Как вы создаете/регистрируете этот класс? Не могли бы вы предоставить пример кода, который воспроизводит эту проблему? –

+0

Ну, я добавляю свой интерфейс к IoC с помощью «services.AddTransient (typeof (IFWHtmlHelper <>), typeof (FWHtmlHelper <>)); и вводят его в представление @inject IFWHtmlHelper FWHtml. Затем я создал расширение для моего помощника с общедоступным статическим тегом TagBuilder (этот IFWHtmlHelper fwHelper, выражение <выражение FOM >) {} –

+0

Как говорится в ошибке, 'IHtmlHelper' только делает смысл при использовании в контексте представления и, таким образом, вводит «ViewContext», предоставляемый путем вызова его метода «Contextualize». Почему бы не создать расширение непосредственно над 'IHtmlHelper' или создать помощник тега? –

ответ

1

У меня была такая же проблема. Поскольку MVC добавляет IHtmlHelper в зависимость от временной области, мы не получаем тот же IHtmlHelper, что и представление. MVC контекстуализирует другой экземпляр, но не частный, который получает ваш класс.

Мое решение было контекстуализировать частный (переходный) IHtmlHelper, что DI прошло. Чтобы сделать это, реализовать IViewContextAware, а затем передать эту contexualization на частном IHtmlHelper так он подключен вверх, как он хочет

public partial class MyHelper : IViewContextAware {   
     public MyHelper(IHtmlHelper htmlHelper) { 
      this.Html = htmlHelper;       
     } 
     public IHtmlHelper Html { 
      get; 
      private set; 
     } 

     void IViewContextAware.Contextualize(ViewContext viewContext) { 
      if (Html is IViewContextAware) { 
       ((IViewContextAware)Html).Contextualize(viewContext); 
      } 
     } 
    }