使用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;
}
问题是,当我试图访问帮助器时,我得到了这个错误:
那么,我如何创建自己的helper并访问viewhtml helper实例呢?InvalidOperationException:在使用HtmlHelper实例之前必须调用'Contextualize'方法。
*按要求编辑:
添加到容器
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)
{}
我也遇到过同样的问题。由于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);
}
}
}