Метод, который расширяется до tag-helper

У меня есть следующий метод в cshtml файле. Он просто расширяется на два label элемента. Первый - это простой элемент label. Однако второй использует помощник тега:

async Task field(string str)
{
    <label for="@str">@str</label>

    <label asp-for="@str">@str</label>
}

Вот как я определил это в файле cshtml вместе с его однократным вызовом:

@{ 
    {
        async Task field(string str)
        {
            <label for="@str">@str</label>

            <label asp-for="@str">@str</label>
        }

        await field("abc");
    }
}

Если я «просматриваю исходный код» результата, я вижу следующее:

<label for="abc">abc</label>
<label for="str">abc</label>

Обратите внимание, что аргумент @str был правильно передан и использован в первом случае, но не во втором случае. Похоже, что здесь проблема с передачей аргумента в вариант tag-helper.

Любые предложения о том, как решить эту проблему?


person dharmatech    schedule 14.06.2020    source источник


Ответы (1)


На мой взгляд, аргумент в варианте tag-helper передан успешно. Но атрибут asp-for метки будет отображаться как атрибут for со значением имени asp-for ModelExpression (str), а не значением ModelExpression's model (abc).

В соответствии с тегом rel="nofrerollow / a>, вы можете обнаружить, что помощник по тегу вызовет метод Generator.GenerateLabel для создания HTML-содержимого тега label.

Инструмент имеет пять параметров, третье выражение параметра используется для создания метки для атрибута.

 var tagBuilder = Generator.GenerateLabel(
        ViewContext,
        For.ModelExplorer,
        For.Name,
        labelText: null,
        htmlAttributes: null);

введите описание изображения здесь

Если вы хотите показать значение str для атрибута for, вам следует создать настраиваемый ярлык labeltaghelper.

Более подробную информацию вы можете найти в кодах ниже:

[HtmlTargetElement("label", Attributes = "asp-for")]
public class ExtendedAspForTagHelper:LabelTagHelper
{
    public ExtendedAspForTagHelper(IHtmlGenerator generator)
        : base(generator)
    {
    }
    public override int Order => -10000;


    //public override void Process(TagHelperContext context, TagHelperOutput output)
    //{
    //    base.Process(context, output);



    //    if (!output.Attributes.TryGetAttribute("maxlength", out TagHelperAttribute maxLengthAttribute))
    //    {
    //        return;
    //    }



    //    var description = $"Only <b>{maxLengthAttribute.Value}</b> characters allowed!";
    //    output.PostElement.AppendHtml(description);
    //}
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }




        if (output == null)
        {
            throw new ArgumentNullException(nameof(output));
        }




        var tagBuilder = Generator.GenerateLabel(
            ViewContext,
            For.ModelExplorer,
            For.Model.ToString(),
            labelText: null,
            htmlAttributes: null);




        if (tagBuilder != null)
        {
            output.MergeAttributes(tagBuilder);




            // Do not update the content if another tag helper targeting this element has already done so.
            if (!output.IsContentModified)
            {
                // We check for whitespace to detect scenarios such as:
                // <label for="Name">
                // </label>
                var childContent = await output.GetChildContentAsync();
                if (childContent.IsEmptyOrWhiteSpace)
                {
                    // Provide default label text (if any) since there was nothing useful in the Razor source.
                    if (tagBuilder.HasInnerHtml)
                    {
                        output.Content.SetHtmlContent(tagBuilder.InnerHtml);
                    }
                }
                else
                {
                    output.Content.SetHtmlContent(childContent);
                }
            }
        }
    }
}

Улучшить эту подсказку тегов в _ViewImports.cshtml

@addTagHelper *,[yournamespace]

Результат:

введите описание изображения здесь

person Brando Zhang    schedule 15.06.2020