Пользовательский помощник по тегам и ненавязчивая проверка в ядре asp.net - PullRequest
0 голосов
/ 03 июля 2019

Я сгенерировал элементы формы динамически, используя класс TagHelper, извлекая метаданные о полях формы из базы данных.Я добавил ненавязчивую проверку, сгенерировав все атрибуты, необходимые для проверки, такие как data-val-required атрибуты и т. Д. (Проверьте функцию ValidationAnnotation () ).Обычно эти атрибуты добавляются в MVC стандартным способом посредством аннотации данных, помечая поле как обязательное.В случае, если я не могу использовать аннотацию данных, так как все поля извлекаются из базы данных.Есть ли другой стандартный способ добавления ненавязчивой проверки для такого случая?

 public class CustomAttributeTagHelper : TagHelper
    {
        private readonly ISchemaService _schemaService;
        public Dictionary<string, object> CustomUserInfo { get; set; }
        public CustomAttributeTagHelper (
            ISchemaService schemaService
            )
        {
            _schemaService = schemaService;
        }

        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            var userSchemasResponse = await _schemaService.GetUserSchema();
            if (userSchemasResponse.Success)
            {
                output.Content.AppendHtml("<div>");
                output.Content.AppendHtml("<div>");
                foreach (var userSchema in userSchemasResponse.UserSchemas)
                {
                    //validation data annotation
                    string validationAnnotationMessage = string.Empty, validationAnnotationInput = string.Empty;
                    if (userSchema.IsRequiredField)
                    {
                        (validationAnnotationMessage, validationAnnotationInput) = ValidationAnnotation(userSchema);
                    }

                    if (userSchema.Type == "string")
                    {  
                        output.Content.AppendHtml("<div>");
                        string value = string.Empty;
                        if (CustomUserInfo.ContainsKey(userSchema.PropertyName))
                        {
                            value = CustomUserInfo[userSchema.PropertyName].ToString();
                        }
                        output.Content.AppendHtml(
                            $"<Label for= {userSchema.PropertyName}> {userSchema.Title} </Label>");
                        if (userSchema.CustomEnums.Count > 0)
                        {
                            output.Content.AppendHtml(
                                $"<select {validationAnnotationInput} for= '{userSchema.PropertyName}' Id='{userSchema.PropertyName}' name='{userSchema.PropertyName}' >");
                            foreach (var custEnum in userSchema.CustomEnums)
                            {
                                output.Content
                                    .AppendHtml($"<option value='' selected>Please Select</option>");
                                if (value != null && value.Equals(custEnum.Value, StringComparison.OrdinalIgnoreCase))
                                {
                                    output.Content
                                        .AppendHtml($"<option value='{custEnum.Key}' selected>{custEnum.Value}</option>");
                                }
                                else
                                {
                                    output.Content
                                        .AppendHtml($"<option value='{custEnum.Key}' >{custEnum.Value}</option>");
                                }
                            }

                            output.Content.AppendHtml($"</select>");
                        }
                        else
                        {


                            output.Content.AppendHtml(
                                $"<Input {validationAnnotationInput} for= '{userSchema.PropertyName}' Id='{userSchema.PropertyName}' name='{userSchema.PropertyName}' value='{value}'/>");
                               output.Content.AppendHtml($"<span   />");

                        }

                        output.Content.AppendHtml($"<span {validationAnnotationMessage}  ></span>");
                        output.Content.AppendHtml("</div>");
                    }

                    if (userSchema.Type == "boolean")
                    {
                        bool value = false;
                        if (CustomUserInfo.ContainsKey(userSchema.PropertyName))
                        {
                            value = Convert.ToBoolean(CustomUserInfo[userSchema.PropertyName].ToString());
                        }
                        output.Content.AppendHtml("<div>");
                        output.Content.AppendHtml(
                            $"<Label for= {userSchema.PropertyName}> {userSchema.Title} </Label>");
                        output.Content.AppendHtml("<div>");
                        if (value)
                        {
                            output.Content.AppendHtml(
                                $"<Input type='radio' checked={true}   for= {userSchema.PropertyName} Id={userSchema.PropertyName} name={userSchema.PropertyName} > Yes");
                            output.Content.AppendHtml(
                                $"<Input type='radio'  for= {userSchema.PropertyName} Id={userSchema.PropertyName} name={userSchema.PropertyName} > No");
                        }
                        else
                        {
                            output.Content.AppendHtml(
                                $"<Input type='radio'    for= {userSchema.PropertyName} Id={userSchema.PropertyName} name={userSchema.PropertyName} > Yes");
                            output.Content.AppendHtml(
                                $"<Input type='radio' checked={false}  for= {userSchema.PropertyName} Id={userSchema.PropertyName} name={userSchema.PropertyName} > No");
                        }
                        output.Content.AppendHtml("</div>");
                        //output.Content.AppendHtml($"<span asp-validation-for={userSchema.PropertyName}  />");
                        output.Content.AppendHtml("</div>");
                    }




                }
                output.Content.AppendHtml("</div>");
                output.Content.AppendHtml("</div>");
            }

        }
//validation data annotation
        private Tuple<string , string > ValidationAnnotation(
            UserSchema userSchema)
        {
            var validationAnnotationMessage =
                $"data-valmsg-replace=true data-valmsg-for='{userSchema.PropertyName}' class='field-validation-valid'";
            var validationAnnotationInput = $"data-val=true data-val-required='{userSchema.Title} is required'";
            return new Tuple<string, string>(validationAnnotationMessage, validationAnnotationInput);

        }
    }

сгенерированная страница: enter image description here

1 Ответ

1 голос
/ 04 июля 2019

Я упрощаю ваш код до приведенного ниже, он работает правильно с ненавязчивой проверкой.

  1. CustomAttributeTagHelper

    public class CustomAttributeTagHelper : TagHelper
    {
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            output.Content.AppendHtml("<div>");
            string validationAnnotationMessage = string.Empty, validationAnnotationInput = string.Empty;
            UserSchema userSchema = new UserSchema { PropertyName = "Title" , Title = "Title", Type = "string"};
            (validationAnnotationMessage, validationAnnotationInput) = ValidationAnnotation(userSchema);
    
            if (userSchema.Type == "string")
            {
                output.Content.AppendHtml("<div>");
                string value = string.Empty;
    
                output.Content.AppendHtml(
                    $"<Label for= {userSchema.PropertyName}> {userSchema.Title} </Label>");
                output.Content.AppendHtml(
                    $"<Input {validationAnnotationInput} for= '{userSchema.PropertyName}' Id='{userSchema.PropertyName}' name='{userSchema.PropertyName}' value='{value}'/>");
                output.Content.AppendHtml($"<span   />");
    
                output.Content.AppendHtml($"<span {validationAnnotationMessage}  ></span>");
                output.Content.AppendHtml("</div>");
            }
            output.Content.AppendHtml("</div>");
        }
        private Tuple<string, string> ValidationAnnotation(
        UserSchema userSchema)
        {
            var validationAnnotationMessage =
                $"data-valmsg-replace=true data-valmsg-for='{userSchema.PropertyName}' class='field-validation-valid'";
            var validationAnnotationInput = $"data-val=true data-val-required='{userSchema.Title} is required'";
            return new Tuple<string, string>(validationAnnotationMessage, validationAnnotationInput);
    
        }
    }
    
  2. Просмотр

    <div class="row">
        <div class="col-md-4">
            <form asp-action="Create">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <custom-attribute></custom-attribute>
                <div class="form-group">
                    <label asp-for="Title" class="control-label"></label>
                    <input asp-for="Title" class="form-control" />
                    <span asp-validation-for="Title" class="text-danger"></span>
                </div>
    
                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>
    
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    

Заметка

Проверьте, является ли этот код @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} на ваш взгляд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...