【发布时间】:2017-02-10 16:28:24
【问题描述】:
我创建了一个使用VS2015-Update3 创建的示例ASP.NET MVC Core 1.1 Web 应用程序。它仅在作为主键的模型属性和 bool 类型的属性上生成带有 data -* attributes 的输入标签。例如,在以下示例中,生成的 html(如下所示)仅显示为模型的属性 MyEntityId 和 Prop2 生成的输入标记上的数据属性。 注意:我使用的是默认的 ASP.NET Core Web 应用程序模板,它会自动安装 Jquery、Bootstrap 等。
型号:
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>
【问题讨论】:
-
根本无法复制,这不是正常行为。我只能假设您必须在某处覆盖了默认行为。我建议一开始,您将
<input asp-for="StartDate" type="date" class="form-control" />注释掉并替换为@Html.TextBoxFor(m => m.StartDate)并发布为此呈现的html(这将有助于缩小问题范围) -
请注意,即使可以为空的属性也会生成
data-val-*属性,例如StartDate你会得到data-val-date="The field StartDate must be a date. -
@StephenMuecke 你是对的,因为当我仅使用上述示例创建测试应用程序时,我可能会在某处覆盖默认行为。它确实显示了
TestCode的data-*属性。但是,对于StateDate,它没有显示 data-* 属性:对于标签助手,它显示<input type="date" class="form-control" id="StartDate" name="StartDate" value="">,而对于 html 助手,它显示<input id="StartDate" name="StartDate" type="text" value="">。原因可能是我使用DateTime作为可选DateTime? -
这没什么区别 -
TextBoxFor()方法将添加data-val-date="..."因为该值必须是null或有效日期(如果用户输入“xyx”,它将生成验证错误说它必须是一个日期。如果它没有为您添加该属性,那么您在某处有一些代码覆盖了正常行为(例如自定义扩展方法或EditorTemplate) -
@StephenMuecke 嗯。它可能与我的
VS2015设置有关,因为我创建了一个新的 MVC 核心应用程序,只有上面的示例和Individual User Authentication选项。除了它们的内置代码和我上面的示例之外,没有其他任何东西。
标签: asp.net-mvc visual-studio-2015 asp.net-core-mvc asp.net-mvc-validation