gpt4 book ai didi

asp.net-core - 将 IHtmlHelper 与依赖注入(inject)一起使用

转载 作者:行者123 更新时间:2023-12-04 16:29:59 25 4
gpt4 key购买 nike

我将创建一个 Controller ,该 Controller 响应通过 IHtmlHelper 接口(interface)创建的第三方 IHtmlContent 而不使用 View() 方法。实际上我正在使用一种解决方法:

我创建了 IHtmlHelper 的扩展函数,其行为类似于“主”,而其他静态函数的行为类似于“奴隶”。主函数根据它作为参数接收的数据结构调用从属函数。从站基于第三方库创建 IHtmlContent。当所有从机功能完成后, Controller 发回响应。
此行为在 Controller 调用的 cshtml View 中。

是否可以使用依赖注入(inject)将 IHtmlHelper 作为 Controller 构造函数参数?

就像是

public class MyTestController 
{
private readonly IHtmlHelper _html;

public MyTestController(IHtmlHelper html) {
_html = html;
}
}

如果可能的话,我会简化许多操作,因为我正在使用这个主/从功能来复制一个类的行为

在这里,您可以找到我的代码现在如何工作以及我想如何更改它的纯示例
https://gist.github.com/Blackleones/eb0d02b9dd99164271af88e22143d72b#file-example-cs

我需要这个组件,因为第三方库是 IHtmlHelper 的扩展

最佳答案

我感谢 Itminus 回答我。

但是,在 Controller 构造函数上调用 IHtmlHelper 是不够的,您必须在使用 IHtmlHelper 之前对其进行上下文化。

我想分享我找到的另一个解决方案并解决我的问题,也许它对其他用户有用。
请看 https://gist.github.com/Blackleones/eb0d02b9dd99164271af88e22143d72b#file-example-cs记住我的目标是什么。

  • 为了解决我的问题,我创建了一个名为 HtmlHelperAdapter 的类,其中包含我需要的一些实例。
  • public class MyHtmlHelperAdapter
    {
    public IHtmlHelper _html;

    public NubessHtmlHelperAdapter(IHtmlHelper html)
    {
    _html = html;
    }

    public IHtmlHelper Html => _html;
    public ViewContext ViewContext => _html.ViewContext;
    public HttpContext HttpContext => _html.ViewContext.HttpContext;
    public ViewDataDictionary ViewData => _html.ViewData;
    public IServiceProvider provider => _html.ViewContext.HttpContext.RequestServices;
    }
  • 之后,我为 IHtmlHelper
  • 创建了一个扩展方法
    public static class MyBuilderExtension
    {
    public static MyBuilder Nubess(this IHtmlHelper html)
    {
    return new MyBuilder(new MyHtmlHelperAdapter(html));
    }
    }

    MyBuilder 在哪里
    public class MyBuilder
    {
    private readonly MyHtmlHelperAdapter _htmlHelper;

    public MyBuilder(MyHtmlHelperAdapter htmlHelper)
    {
    _htmlHelper = htmlHelper;
    }

    public FormBuilder<object> Form<T>(IDictionary<string, string> customizeArgs = null, FormBuilder<object> externalForm = null)
    {
    return new FormBuilder(_htmlHelper, typeof(T), customizeArgs, externalForm).Build();
    }
    }
  • 现在我可以使用 为 View 创建自定义内容类(class) 感谢 MyHtmlHelperAdapter
  •  public class FormBuilder
    {
    private MyHtmlHelperAdapter _htmlHelper;
    private readonly IStringLocalizer<SharedResources> _localizer;
    private readonly LinkGenerator _linkGenerator;
    private readonly IEngine _engine;
    private readonly IEngineElement _element;
    private readonly Type _typeDescriptor;
    private readonly IDictionary<string, string> _descriptorArgs;

    /* variabili per semplificare la gestione del builder */
    private readonly FormBuilder<object> Form;
    private readonly FormConfig Config;
    private readonly IList<FormGroupConfig> Groups;
    private readonly IList<FormItemConfig> Items;
    private readonly IDictionary<string, string> FormOptions;

    private readonly string _clientPrefix = "smtForm_{0}_";

    public FormBuilder(MyHtmlHelperAdapter htmlHelper, Type typeDescriptor, IDictionary<string, string> ModelCustomizeArgs = null, FormBuilder<object> externalForm = null)
    {
    _htmlHelper = htmlHelper;
    _localizer = _htmlHelper.provider.GetRequiredService<IStringLocalizer<SharedResources>>() ?? throw new ArgumentNullException();
    _linkGenerator = _htmlHelper.provider.GetRequiredService<LinkGenerator>() ?? throw new ArgumentNullException();
    _engine = _htmlHelper.provider.GetRequiredService<IEngine>() ?? throw new ArgumentNullException();

    //code..
    }


    public FormBuilder<object> Build()
    {
    //code..
    return Form;
    }

    //methods..
    }

    关于asp.net-core - 将 IHtmlHelper 与依赖注入(inject)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55067308/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com