Я сгенерировал элементы формы динамически, используя класс 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);
}
}
сгенерированная страница: