【问题标题】:Futures : Taghelpers --> Razor ComponentsFutures : Taghelpers --> Razor 组件
【发布时间】:2021-08-24 15:10:35
【问题描述】:

我想知道是否有人对 TagHelpers & Razor Components 的未来有任何看法或知识。我的问题仅与初始渲染有关。不在客户端使用 C# 代码。

我喜欢 razor 组件模型的工作原理,即基本组件在标记中布局,然后是代码。

这与生成标记的 TagHelpers 进行比较。

以我使用的这个 TagHelper 标签组件为例...

using Microsoft.AspNetCore.Razor.TagHelpers;

namespace gMIS.TagHelpers
{
    [HtmlTargetElement("glabel", TagStructure = TagStructure.WithoutEndTag)]
    public class glabelTagHelper : TagHelper
    {
        #region Attributes

        [HtmlAttributeName("id")]
        public string id { get; set; }

        [HtmlAttributeName("class")]
        public string cls { get; set; }

        [HtmlAttributeName("xy")]
        public string xy { get; set; }

        [HtmlAttributeName("style")]
        public string style { get; set; }

        [HtmlAttributeName("value")]
        public string value { get; set; }

        #endregion Attributes

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            //START with the container DIV
            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            if (id != null) output.Attributes.Add("id", id);
            if ((xy != null) && (xy != null)) output.Attributes.Add("class", "xy" + xy);
            if (style != null) output.Attributes.Add("style", "display:inline-block; font-weight:bold;" + style); //*** Any subsequent WIDTH passed in with supercede the default provided here!
            else output.Attributes.Add("style", "display:inline-block; font-weight:bold;");
            if (cls != null) output.Attributes.Add("class", cls);

            //Insert data value
            if (value != null) output.Content.AppendHtml(value);
        }
    }
}

如果可以这样编码,我会很高兴的......

<div id="{inject id}" class="{inject class}" style="{inject style}">{inject text}</div>

...而不是使用 C# 创建基本标记。

output.TagName = "div";
output.TagMode = TagMode.StartTagAndEndTag;

然后后面的代码进行交互(仅服务器端)以完成基本组件标记的配置。这样,您可以看到基本标记,而不是更难阅读和可视化的 C# 标记结构。

使用基本标签,这似乎没什么好处,但使用更复杂的组件,能够可视化标记将是一个真正的福音。

    <div class="{inject class}" id="{inject id}" style="{inject style}">
        <input name="{inject name}" id="{inject id}" style="{inject style}" type="text" value="-4" data-val-required="&amp;nbsp;Req!" data-val="true">
        <input id="{inject id}" style="{inject style}" type="text" placeholder="Start typing here to search..." autocomplete="off">
        <select id="{inject id}" style="{inject style}" size="1">
        </select>

        <script type="text/javascript">   
$(document).ready(function () {       $('#ext_IT_Task_Reported_By_ID').glookupInit('/TagHelpers/InternalContactLookup');   });</script>

        <span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="{inject id}"></span>
    </div>

有人知道 Taghelpers 的长期发展方向吗?也许是朝着 Razor Component 的构造方式。抱歉,如果我的帖子不够清楚。我认真考虑过如何表达我的问题。我希望这不会令人困惑。

【问题讨论】:

    标签: asp.net-core-tag-helpers razor-components


    【解决方案1】:

    不确定您在这里问的确切内容,但我认为您不了解标签助手的工作原理。您不必手动将每个属性添加到输出中,如果您实际上不需要用于标记帮助程序的值,那么您当然不需要支持属性。 Razor 不会影响任何其他属性。

    [HtmlTargetElement("glabel")]
    public class glabelTagHelper : TagHelper
    {
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
    
            var style = "display:inline-block; font-weight:bold";
            if (output.Attributes.TryGetAttribute("style", out var attr))
            {
                style += $";{attr.Value}";
            }
            output.Attributes.SetAttribute("style", style);
        }
    }
    

    根据您的代码,您要修改的唯一内容是style 属性,因此其他所有内容(包括内容)都可以并且将按原样进行。然后,对于样式,您只需要查看属性是否已经存在,如果存在,请将其附加到您的自定义样式中。只需上面的代码:

    <glabel id="foo" class="foo" style="width:100px">
        <!-- child content here -->
    </glabel>
    

    将导致:

    <div id="foo" class="foo" style="display:inline-block;font-weight:bold;width:100px">
        <!-- child content here -->
    </div>
    

    如果你需要在那里做一些特殊的事情,子元素需要成为它们自己的标签助手。标签助手仅对直接标签本身进行操作,而不是对整个 HTML 块进行操作。您可以获取子内容并手动修改它,但您只是作为一个字符串这样做,必须使用正则表达式之类的东西。可以这么说,这不太理想。

    【讨论】:

      【解决方案2】:

      Chris Pratt(如何正确引用其他用户?)

      很遗憾,您确实误解了这个问题。我在创建 TagHelpers 或理解它们的工作方式方面没有问题。我们已经开发了大约 20-25 个 TagHelper,从动态查找到我们自己相当广泛和强大的网格。下面的网格使用示例...

      <ggrid id="grdTaskSearchResults"
             url="Task_Search?handler=results&userguid=@Model.UserGUID&manager=@Model.Manager"
             sortby="@Model.Opt_SortCol"
             sortdir="@Model.Opt_SortDir"
             pagesize="100"
             style="height:100%; width:100%;">
          <cols>
              <coltemplate style="white-space:nowrap;">
                  <a onclick="gNewWindowAndTitle('View IT Call Log', null, null, 'Task_Summary?userguid=@Model.UserGUID&taskId={Task_ID}')" title="View IT Call Log"><img class="smallIcon" src="/Icons/Magnify.gif" /></a>
                  <gpdialog btnexit="Cancel" btnsubmitandclose="Save" title="Edit Call Log" url="Task_CRUD?userguid=@Model.UserGUID&manager=@Model.Manager&crud=u&taskId={Task_ID}" callback="ggridReload('grdTaskSearchResults')" linkicon="/Icons/Edit.gif" hideif="('@Model.Manager' !== 'true')" suppresstitle="true" />
                  <gpdialog btnexit="Cancel" btnsubmitandclose="Save" title="Add Note to Call Log" url="Task_Note_CRUD?userguid=@Model.UserGUID&taskId={Task_ID}" callback="ggridReload('grdTaskSearchResults')" linkicon="/Icons/NewAddition.gif" suppresstitle="true" />
                  <img class='smallIcon' src="/Icons/Exclamation.gif" alt='Not Responded yet!' hideif="{Responded}===true" />
              </coltemplate>
              <col heading="ID" fld="Task_ID" />
              <col heading="Type" fld="Task_Type" style="white-space:nowrap;" />
              <col heading="Status" fld="Task_Status" />
              <coltemplate heading="Reported By">
                  <a target="_blank" href="https://gmis.info/entity/entity.asp?ec=1&code={Reported_By_ID}">{Reported_By_Name}</a>
              </coltemplate>
              <col heading="Date Entered" fld="Date_Entered" style="white-space:nowrap;" format="ddMMMyy" />
              <col heading="NAB" fld="NAB_Initials" style="white-space:nowrap;" />
              <coltemplate heading="Severity">
                  <span hideif="{Task_Status_ID}===3" style="color:{Severity_Color}; font-family:Webdings; font-size:10pt;">n</span><span hideif="{Task_Status_ID} == 3">&nbsp;&nbsp;{Task_Severity}</span>
              </coltemplate>
              <col heading="Description" fld="Description" />
          </cols>
          <footer>
              <gpdialog btnexit="Cancel" btnsubmitandclose="Save" title="Add New Call Log" url="Task_CRUD?userguid=@Model.UserGUID&manager=@Model.Manager&crud=c" callback="ggridReload('grdTaskSearchResults')" linkicon="/Icons/NewAddition.gif" />
          </footer>
      </ggrid>
      

      也就是说,我想在我自己的代码中查看您的代码示例中的一些内容。我想我可以在那里设想一个对我们的潜在改进。所以在这方面,我非常感谢您的意见。

      不,我的问题纯粹是关于 TagHelper 故事的下一步。

      • HtmlHelpers 是用 c# 编写并在 c# 中调用的。

      • Taghelper 是用 c# 编写并在 html 标记中调用。

      • Razor 组件是用 html 标记编写的,并带有一些内联/隐藏的 c# 代码。但是最好使用 html 标记在 Blazor 中实现。当从 Razor 页面中调用时,调用是在 c# 代码中进行的,有点像 HtmlHelpers(对我来说是一个倒退)。

      我希望将来在这个故事的某个地方看到一个场景,即 TagHelpers 是用 html 标记编写的,其中包含一些内联/隐藏的 c# 代码,就像现在的 Razor 组件一样。在使用中,Taghelper 调用了当前的标记。我并不是建议 TagHelpers 开始在客户端使用 c#。这纯粹是关于 TagHelpers 的当前外观和功能......是如何编写的。

      本质上,我在问是否有人知道 TagHelpers 下一步的未来会怎样?这有意义吗?

      【讨论】:

        【解决方案3】:

        我想几年后,我知道我正在寻找的答案。在某些时候向前发展,Blazor 组件是下一个趋势。我现在正在考虑将来将我所有的 taghelper 转换为 blazor 组件。目前,唯一阻止我的是你必须在剃须刀页面中使用一些非常冗长的 c# 代码才能使用 blazor 组件。我一直在坚持,直到他们不可避免地感觉到,所以你可以使用 Html 标记来使用 razor 页面中的 blazor 组件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-09
          • 2021-04-22
          • 1970-01-01
          • 2019-07-31
          • 2021-11-17
          • 2016-06-11
          • 2020-05-16
          • 2011-03-12
          相关资源
          最近更新 更多