带有 IHtmlHelper 参考的自定义剃须刀助手

Luc*_*lip 5 c# asp.net-core-mvc asp.net-core

我正在玩 ASP.NET Core,并试图将我的助手迁移到它。我已将自己的帮助程序注入到视图中,但我需要访问默认的 IHtmlHelper (我不想扩展 HtmlHelper)。

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

public FWHtmlHelper(IHtmlHelper htmlHelper)
{
        this._htmlHelper = htmlHelper;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试访问帮助程序时,出现以下错误:

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

那么,我如何创建自己的帮助程序并访问 View html 帮助程序实例?

*根据要求编辑:

添加到容器中

services.AddTransient(typeof(IFWHtmlHelper<>), typeof(FWHtmlHelper<>));
Run Code Online (Sandbox Code Playgroud)

将其注入到视图中

@inject IFWHtmlHelper<TModel> FWHtml
Run Code Online (Sandbox Code Playgroud)

然后,我为我的助手创建了一个扩展

public static TagBuilder Example<TModel, TValue>(this IFWHtmlHelper<TModel> fwHelper, Expression<Func<TModel, TValue>> expression)
{} 
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 5

我也有同样的问题。由于 MVC 将 IHtmlHelper 添加为瞬态作用域依赖项,因此我们不会获得与视图相同的 IHtmlHelper。MVC 将另一个实例置于上下文中,但不会将您的类所获得的私有实例置于上下文中。

我的解决方案是对 DI 传入的私有(瞬态)IHtmlHelper 进行上下文化。为此,请实现 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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)