在ASP.NET Core 1.1中使用以下DataAnnotations。最好将我的MVC视图中的输入的最大长度设置为限制用户输入。
型号
[Display(Name = "Post Code")]
[MaxLength(8, ErrorMessage = "Maximum number of characters that can be entered is 8!")]
public string PostCode
{ get; set; }
查看
<label asp-for="PostCode"></label>
<input style="font-weight: normal;" class="form-control" placeholder="Post Code" asp-for="PostCode" data-val="true" autofocus />
呈现为
<input style="font-weight: normal;" class="form-control valid" placeholder="Post Code" data-val="true" autofocus="" type="text" data-val-maxlength="Maximum number of characters that can be entered is 8!" data-val-maxlength-max="8" id="PostCode" name="PostCode" value="" wtx-context="FA5749C8-68AC-44FE-88B9-4BBDF9D48DAE" aria-invalid="false" aria-describedby="PostCode-error">
我希望生成来自我的类数据注释的maxlength属性,如下所示。 (滚动到结尾);
<input style="font-weight: normal;" class="form-control valid" placeholder="Post Code" data-val="true" autofocus="" type="text" data-val-maxlength="Maximum number of characters that can be entered is 8!" data-val-maxlength-max="8" id="PostCode" name="PostCode" value="" wtx-context="FA5749C8-68AC-44FE-88B9-4BBDF9D48DAE" aria-invalid="false" aria-describedby="PostCode-error" maxlength="8">
感谢任何建议。
答案 0 :(得分:7)
您可能需要通过TagHelper实现此功能,TagHelper可以读取此属性并在呈现时将其添加到元素,因为默认asp-for
将无法处理此属性。
扩展输入TagHelper
尝试在项目中按如下方式声明TagHelper,这将占用现有的asp-for
帮助程序并处理读取任何现有属性/元数据并将必要的属性附加到元素:
namespace YourProject.TagHelpers
{
[HtmlTargetElement("input", Attributes = "asp-for")]
public class MaxLengthTagHelper : TagHelper
{
public override int Order { get; } = 999;
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
base.Process(context, output);
// Process only if 'maxlength' attr is not present
if (context.AllAttributes["maxlength"] == null)
{
// Attempt to check for a MaxLength annotation
var maxLength = GetMaxLength(For.ModelExplorer.Metadata.ValidatorMetadata);
if (maxLength > 0)
{
output.Attributes.Add("maxlength", maxLength);
}
}
}
private static int GetMaxLength(IReadOnlyList<object> validatorMetadata)
{
for (var i = 0; i < validatorMetadata.Count; i++)
{
var stringLengthAttribute = validatorMetadata[i] as StringLengthAttribute;
if (stringLengthAttribute != null && stringLengthAttribute.MaximumLength > 0)
{
return stringLengthAttribute.MaximumLength;
}
var maxLengthAttribute = validatorMetadata[i] as MaxLengthAttribute;
if (maxLengthAttribute != null && maxLengthAttribute.Length > 0)
{
return maxLengthAttribute.Length;
}
}
return 0;
}
}
}
使用TagHelper
然后直接在特定视图中添加对它的引用,或者在_ViewImports.cshtml
文件中全局添加引用,如下所示:
@using YourProject
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourProject
添加后,此扩展TagHelper应使用相应的maxlength
属性自动装饰您的元素(如果您的属性中存在):
<!-- Input -->
<label asp-for="PostCode"></label>
<input style="font-weight: normal;" class="form-control" placeholder="Post Code" asp-for="PostCode" data-val="true" autofocus />
<!-- Rendered -->
<label for="PostCode">Post Code</label>
<input style="font-weight: normal;" class="form-control" placeholder="Post Code" data-val="true" autofocus="" type="text" data-val-maxlength="Maximum number of characters that can be entered is 8!" data-val-maxlength-max="8" id="PostCode" name="PostCode" value="" maxlength="8">