使用IHtmlHelper参考的自定义剃须刀助手

时间:2016-10-24 22:53:47

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

我正在玩asp.net核心,并试图将我的助手迁移到它。我已经为视图注入了自己的帮助器,但我需要访问默认的IHtmlHelper(我不想扩展HtmlHelper)。

所以,我构建了这样的构造函数,从IoC中获取具体的IHtmlHelper。

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

问题是,当我试图访问帮助程序时,我收到了这个错误:

  

InvalidOperationException:在使用此HtmlHelper实例之前必须调用'Contextualize'方法。

那么,我如何创建自己的帮助器并访问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)
{} 

1 个答案:

答案 0 :(得分:2)

我有同样的问题。由于MVC将IHtmlHelper添加为临时作用域依赖项,因此我们不会获得与视图相同的IHtmlHelper。 MVC将另一个实例上下文化,但不是你的类得到的私有。

我的解决方案是对DI传入的私有(瞬态)IHtmlHelper进行Contextual化。为此,实现IViewContextAware,然后将该上下文传递给私有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);
            }
        }
    }