使用IHtmlHelper引用自定义razor helper

本文关键字:razor helper 自定义 引用 IHtmlHelper 使用 | 更新日期: 2023-09-27 18:14:38

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

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

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

问题是,当我试图访问帮助器时,我得到了这个错误:

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

那么,我如何创建自己的helper并访问viewhtml helper实例呢?

*按要求编辑:

添加到容器

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)
{} 

使用IHtmlHelper引用自定义razor helper

我也遇到过同样的问题。由于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);
            }
        }
    }