【发布时间】:2019-07-03 01:06:00
【问题描述】:
我通过从数据库中提取有关表单字段的元数据,使用 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);
}
}
【问题讨论】:
-
这段代码有什么问题?
-
我展示的代码工作正常,但我不喜欢我生成验证机制的方式。问题很简单,是否有任何其他标准方法可以使用自定义标签助手启用不显眼的验证?
-
恐怕不行。对于您当前的设计,您可以根据数据库中的数据创建视图。您需要自己添加不显眼的验证属性。
标签: c# asp.net-mvc asp.net-core