我正在玩 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) 我正在尝试使用 hotchocolate 提高 sql 查询性能。为此,我想在应用程序的另一层访问 hotchololate 生成的查询请求。我能找到的唯一方法是拦截请求,将我需要的信息存储在 HttpContext 项中,然后在我需要的地方注入 IHttpContextAccessor。
services.AddQueryRequestInterceptor(GraphQLRequestInterceptor);
...
private Task GraphQLRequestInterceptor(HttpContext context, IQueryRequestBuilder requestBuilder, CancellationToken cancellationToken)
{
IReadOnlyQueryRequest request = requestBuilder.Create();
context.Items.Add("graph", request);
}
Run Code Online (Sandbox Code Playgroud)
然后通过注入 IHttpContextAccessor 来恢复它
public ClientesQueries(Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor)
{
var queryRequest = contextAccessor.HttpContext.Items["graph"] as IReadOnlyQueryRequest;
}
Run Code Online (Sandbox Code Playgroud)
使用该代码,我可以创建一个表达式来查询数据库,仅查找客户端请求的数据。
有更好的方法来实现这一目标吗?