1

我想知道是否有人对 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 的构造方式。抱歉,如果我的帖子不够清楚。我认真考虑过如何表达我的问题。我希望这不会令人困惑。

4

3 回答 3

0

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# 中调用。

  • Taghelpers 是用 c# 编写的,并在 html 标记中调用。

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

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

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

于 2019-10-21T08:02:14.607 回答
0

不确定您在这里要问什么,但我认为您不了解标签助手的工作原理。您不必手动将每个属性添加到输出中,如果您实际上不需要用于标签助手的值,那么您当然不需要支持属性。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 块进行操作。您可以获取子内容并手动修改它,但您只是作为一个字符串这样做,必须使用正则表达式之类的东西。可以说,这不太理想。

于 2019-10-18T13:02:13.033 回答
0

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

于 2021-08-24T07:10:35.360 回答