簡體   English   中英

ASP.NET 核心 - 如何在另一個自定義標簽助手中從 asp-for 標簽助手獲取輸入 ID

[英]ASP.NET Core - How to get the input ID from asp-for tag helper in another custom tag helper

與model class的Member

public class Member
{
    public int PersonId { get; set; }

    public string Name { get; set; }

    [EmailAddress]
    public string Email { get; set; }

    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Telephone { get; set; }

    [Display(Name="Date of Birth")]
    public DateTime DateOfBirth { get; set; }

    public decimal Salary { get; set; }

    [Url]
    public string Website { get; set; }

    [Display(Name="Send spam to me")]
    public bool SendSpam { get; set; }

    public int? NumberOfCats { get; set; }

    public IFormFile Selfie { get; set; }
}

還有一頁model的

public class RegisterModel : PageModel
{
    [BindProperty]
    public Member Member { get; set; }
    public void OnGet()
    {
    }
}

這個 CSHTML

<form method="post">
    <input asp-for="Member.PersonId" /><br />
    <input asp-for="Member.Name" /><br />
    <input asp-for="Member.Email" /><br />
    <input asp-for="Member.Password" /><br />
    <input asp-for="Member.Telephone" /><br />
    <input asp-for="Member.Website" /><br />
    <input asp-for="Member.DateOfBirth" /><br />
    <input asp-for="Member.Salary" /><br />
    <input asp-for="Member.SendSpam" /><br />
    <input asp-for="Member.NumberOfCats" /><br />
    <input asp-for="Member.Selfies" /><br />
    <button>Submit</button>
</form>

產生:

<form method="post">
    <input type="number" data-val="true" data-val-required="The PersonId field is required." id="Member_PersonId" name="Member.PersonId" value="" /><br />
    <input type="text" id="Member_Name" name="Member.Name" value="" /><br />
    <input type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." id="Member_Email" name="Member.Email" value="" /><br />
    <input type="password" id="Member_Password" name="Member.Password" /><br />
    <input type="tel" id="Member_Telephone" name="Member.Telephone" value="" /><br />
    <input type="url" data-val="true" data-val-url="The Website field is not a valid fully-qualified http, https, or ftp URL." id="Member_Website" name="Member.Website" value="" /><br />
    <input type="datetime-local" data-val="true" data-val-required="The Date of Birth field is required." id="Member_DateOfBirth" name="Member.DateOfBirth" value="" /><br />
    <input type="text" data-val="true" data-val-number="The field Salary must be a number." data-val-required="The Salary field is required." id="Member_Salary" name="Member.Salary" value="" /><br />
    <input data-val="true" data-val-required="The Send spam to me field is required." id="Member_SendSpam" name="Member.SendSpam" type="checkbox" value="true" /><br />
    <input type="number" id="Member_NumberOfCats" name="Member.NumberOfCats" value="" /><br />
    <input type="file" id="Member_Selfie" name="Member.Selfie" /><br />
    <button>Submit</button>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8I..." />
    <input name="Member.SendSpam" type="hidden" value="false" />
</form>

我有一個自定義LabelTagHelper將 label 標記的內容設置為顯示屬性的描述。 那部分工作正常。 但是我需要添加“for”標簽屬性來獲得輸入標簽的 ID 值。 例如,在<input type="text" id="Member_Name" name="Member.Name" value="" />行中的 Member_Name 中。 如何在描述的自定義標簽助手中獲取 Member_Name 的值? 這是LabelTagHelper的代碼:

    [HtmlTargetElement("label", Attributes = DescriptionForAttributeName)]
    public class LabelDescriptionTagHelper : TagHelper
    {
        private const string DescriptionForAttributeName = "asp-description-for";
        private const string ForAttribute = "for";

        /// <summary>
        /// Factory of StringLocalizer
        /// </summary>
        private readonly IStringLocalizerFactory _localizerFactory;

        /// <summary>
        /// Creates a new <see cref="LabelDescriptionTagHelper"/>.
        /// </summary>
        /// <param name="generator">The <see cref="IHtmlGenerator"/>.</param>
        /// <param name="factory">Factory of string localizers</param>
        public LabelDescriptionTagHelper(IHtmlGenerator generator, IStringLocalizerFactory factory) => 
            (Generator, _localizerFactory) = (generator, factory);

        /// <inheritdoc />
        public override int Order => -1000;

        [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }

        protected IHtmlGenerator Generator { get; }

        /// <summary>
        /// An expression to be evaluated against the current model.
        /// </summary>
        [HtmlAttributeName(DescriptionForAttributeName)]
        public ModelExpression DescriptionFor { get; set; }

        /// <inheritdoc />
        /// <remarks>Does nothing if <see cref="DescriptionFor"/> is <c>null</c>.</remarks>
        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

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

            if (DescriptionFor.Metadata is DefaultModelMetadata defaultMetadata)
            {
                //  Get the DisplayAttribute from the selected property
                object attributeObject = defaultMetadata
                    .Attributes
                    .PropertyAttributes
                    .FirstOrDefault(attr => attr is DisplayAttribute);

                if (attributeObject != null && attributeObject is DisplayAttribute displayAttribute)
                {
                    //  Actual content of the description of the property
                    string description = displayAttribute.Description;

                    if (!string.IsNullOrEmpty(description))
                    {
                        //  Get the type of the parent object of the selected property
                        Type parentType = DescriptionFor.Metadata.ContainerType;

                        //  Get the string localizer of the parent type by using the stirng localizer factory
                        IStringLocalizer localizer = _localizerFactory.Create(parentType);

                        //  Get the description from the localizer
                        description = localizer[description];
                    }

                    //  Set the content of the tag to the description content
                    output.Content.SetContent(description);

                    //  HERE'S HERE I NEED TO SET THE ID OF THE INPUT TAG. HOW?
                    output.Attributes.Add(ForAttribute, DescriptionFor.Metadata.Name);
                    output.TagMode = TagMode.StartTagAndEndTag;
                }
            }

            return Task.CompletedTask;
        }
    }

你的意思是在<label></label><input asp-for="xxx" />中,讓<label>在輸入中獲取asp-for 。如果是這樣,我認為在label中它無法獲取asp-for .因為視圖中可能有很多input和很多asp-for ,而label無法確定asp-for的位置。

如果要獲取asp-for可以在label中添加asp-for<label asp-for="Member.Name"></label>這樣就可以這樣使用了。

public ModelExpression AspFor { get; set; }
 public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            string name = this.AspFor.Name;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM