我正在玩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)
{}
答案 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);
}
}
}