输入验证仅在主键和复选框类型输入标记上生成data- *属性

时间:2017-02-10 16:28:25

标签: asp.net-mvc visual-studio-2015 asp.net-core-mvc asp.net-mvc-validation

我创建了一个使用ASP.NET MVC Core 1.1创建的示例VS2015-Update3网络应用。它仅在作为主键的模型属性和类型为bool的属性上生成 data - * attributes 的输入标记。例如,在以下示例中,生成的html(如下所示)仅显示为模型的属性MyEntityIdProp2生成的输入标记的数据属性。 注意:我正在使用自动安装Jquery,Bootstrap等的默认ASP.NET核心Web应用程序模板。

模型

public class MyEntity
{
    public int MyEntityId { get; set; }

    public string Prop1 { get; set; }

    [Column(TypeName = "char(2)")]
    [RegularExpression(@"^[0-9]{2,2}$", ErrorMessage = "Must enter two digit numbers"), StringLength(2)]
    public string TestCode { get; set; }

    public DateTime? StartDate { get; set; }

    public bool Prop2 { get; set; }
}

查看

<form asp-controller="TestController" asp-action="TestAction" method="post" class="form-horizontal">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div><input type="hidden" asp-for="MyEntityId" /></div>

    <div class="form-group">
        <label asp-for="Prop1" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="Prop1" class="form-control" style="margin-top:15px;" />
            <span asp-validation-for="Prop1" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="TestCode" class="col-md-2 control-label"></label>
        <div class="col-md-2">
            <input asp-for="TestCode" class="form-control" />
            <span asp-validation-for="TestCode" class="text-danger"></span>
        </div>
    </div>

    <div class="form-group">
        <label asp-for="StartDate" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="StartDate" type="date" class="form-control" />
            <span asp-validation-for="StartDate" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Prop2" class="col-md-2 control-label"></label>
        <div class="col-md-1">
            <input asp-for="Prop2" class="form-control" style="zoom:0.5;margin-top:25px;" />
            <span asp-validation-for="Prop2" class="text-danger"></span>
        </div>
    </div>
    <button type="submit" name="submit" value="testVal">Save</button>
</form>

生成的HTML

<div><input type="hidden" data-val="true" data-val-required="The MyEntityId field is required." id="MyEntityId" name="MyEntityId" value="54321"></div>
<div class="form-group">
    <label class="col-md-2 control-label" for="StateName">Prop1</label>
    <div class="col-md-2">
        <input class="form-control" readonly="" type="text" id="Prop1" name="Prop1" value="TestVal">
        <span class="text-danger field-validation-valid" data-valmsg-for="Prop1" data-valmsg-replace="true"></span>
    </div>
</div>
<div class="form-group">
    <label class="col-md-2 control-label" for="TestCode">TestCode</label>
    <div class="col-md-2">
        <input class="form-control" type="text" id="TestCode" name="TestCode" value="">
        <span class="text-danger field-validation-valid" data-valmsg-for="TestCode" data-valmsg-replace="true"></span>
    </div>
</div>
<div class="form-group">
    <label class="col-md-2 control-label" for="StartDate">Start Date</label>
    <div class="col-md-10">
        <input type="date" class="form-control" id="StartDate" name="StartDate" value="2015-10-01">
        <span class="text-danger field-validation-valid" data-valmsg-for="StartDate" data-valmsg-replace="true"></span>
    </div>
</div>
<div class="form-group">
    <label class="col-md-2 control-label" for="Prop2">Test Prop2</label>
    <div class="col-md-1">
        <input class="form-control" data-val="true" data-val-required="Test Prop2 is required." id="Prop2" name="Prop2" style="zoom:0.5;margin-top:25px;" type="checkbox" value="true">
        <span class="text-danger field-validation-valid" data-valmsg-for="Prop2" data-valmsg-replace="true"></span>
    </div>
</div>

1 个答案:

答案 0 :(得分:1)

我假设您的问题是TestCode没有对其进行验证,尽管同时应用了RegularExpressionStringLength属性。 MyEntityIdProp2不可为空,因此对这些进行了隐式必需的验证,而Prop1StartDate 可以为空并且没有应用任何明确的验证。因此,这些都没有得到验证。

但是,{p> TestCode很奇怪。我不确定您实际上是否获得data-*个属性,因为可以分别使用HTML属性patternmaxlength来满足正则表达式和字符串长度。 但是,然后您应该patternmaxlength应用于TestCode的输入,而不是这种情况。

根据docs,您拥有的代码应该可以使用,至少,StringLength似乎是通过data-val-maxlength而不是(或者可能除此之外)使用maxlength属性。有一些错误在发挥作用,或者你的代码库中有其他东西阻止了正确的行为发生。但是,如果没有更多代码,就无法说出来。