【发布时间】:2019-10-21 00:53:30
【问题描述】:
在我的一个控制器操作中,我做的第一件事是将模型传递给一个新操作,该操作基本上只是解析输入以确定用户是否输入了有效日期。然后返回模型并检查 ModelState.IsValid。
public Import ValidateUploadModel(Import Model)
{
// DO not allow future dates
if (Model.CurrMoInfo.CurrMo > DateTime.Now)
{
ModelState.AddModelError("FutureDate", "You cannot assign a future date.");
}
//Do not allow dates from the same month (we run the processing a month behind)
if (Model.CurrMoInfo.CurrMo.Month == DateTime.Now.Month)
{
ModelState.AddModelError("SameMonth", "You must process a previous month.");
}
//Ensure day is last day of a previous month
if (Model.CurrMoInfo.CurrMo.Day != DateTime.DaysInMonth(Model.CurrMoInfo.CurrMo.Year, Model.CurrMoInfo.CurrMo.Month))
{
ModelState.AddModelError("LastDay", "You must enter the last day of the month.");
}
//Do not allow dates older than 12 months back
if (Model.CurrMoInfo.CurrMo < DateTime.Now.AddMonths(-12))
{
ModelState.AddModelError("TooOld", "Date must not be older than a year.");
}
return Model;
}
当我知道我有模型状态错误时,我可以通过输入以下内容在我的剃刀视图中正确显示它们
<span class="text-danger">@Html.ValidationSummary(false)</span>
所以,由于我所有的模型状态错误都是针对页面上的相同输入的,所以我可以安全地执行此操作。 但是,如果我有各种错误的输入需要相互独立地显示呢?我该怎么做呢?此外,除了使用@Html.ValidationSummary 之外,还有更好(或更合适)的方法吗?
我搜索了 Microsoft 文档和几十个 StackOverflow 问题,试图将较旧的答案翻译成 .Net Core 的做事方式,但没有成功。
为清楚起见进行编辑:
这是剃刀视图中的整张卡片:
<div class="card-body">
@if (Model.StagingCount == 0)
{
<input asp-for="@Model.CurrMoInfo.CurrMo" type="date" required class="col-lg-12" />
}
else
{
<input asp-for="@Model.CurrMoInfo.CurrMo" type="date" disabled="disabled" required class="col-lg-12" />
}
<span class="text-danger">@Html.ValidationSummary(false)</span>
</div>
输入用于模型属性,但没有注释。如果不遵守规则,我已经编写了自己的规则并手动将错误添加到模型状态。我的代码可以工作,但是当我开始需要验证更多字段时它是不可扩展的。我只是想知道这样做的更好方法是什么。
【问题讨论】:
-
这显示了如何为各个字段放置验证消息。例如
<span asp-validation-for="FutureDate" class="text-danger"></span> -
如果您事先知道要显示哪些模型字段(即您没有在 AddModelError 方法中定义任意或动态生成的键),那么您可以使用带有
asp-validation-for标签助手的控件他们。这些将用作在生成特定错误消息时显示特定错误消息的地方。更多详情请见docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/… -
@ADyson 在这种情况下,模型没有注释,我只是在控制器中的方法中创建自己的错误。
asp-validation-for在这里不起作用,因为错误是专门添加到 ModelState 中的。
标签: c# asp.net-core model-view-controller asp.net-core-mvc asp.net-core-2.2