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)
我也有同样的问题。由于 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)
| 归档时间: |
|
| 查看次数: |
2927 次 |
| 最近记录: |