【问题标题】:ASP.NET MVC jQuery Unobtrusive Validation to compare between two datesASP.NET MVC jQuery Unobtrusive Validation 在两个日期之间进行比较
【发布时间】:2019-01-05 23:35:43
【问题描述】:

我正在尝试使用System.ComponentModel.DataAnnotations 验证StartDateEndDate,这样结束日期不得早于开始日期。在我的模型中,我将日期定义如下:

public partial class MyModel
{
    [Required]
    public DateTime StartDate { get; set; }

    [Required]
    public DateTime EndDate { get; set; }
}

我还创建了一个视图模型,如下所示:

public class CompareDateVM : IValidatableObject
{

    public MyModel myModel { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {

        if (myModel.EndDate < myModel.StartDate) {
            yield return
              new ValidationResult(errorMessage: "End Date cannot be lesser than Start Date.",
                                   memberNames: new[] { "EndDate" });
        }
    }
}

服务器端验证有效,错误消息能够显示在我的查看页面的`@Html.ValidationSummary() 中,但我无法在客户端进行验证。

@model CompareDateVM
<form asp-controller="AddDate" asp-action="Add" method="post">

    <label class="label">Start Date</label>
    <input type="date" asp-for="myModel.StartDate" />
    <span asp-validation-for="myModel.StartDate" class="validation"></span><br /><br />

    <label class="label">End Date</label>
    <input type="date"  asp-for="myModel.EndDate" />
    <!-- This is where the client side validation error message show up, but it does not appear-->
    <span asp-validation-for="myModel.EndDate" class="validation"></span>

    <input type="submit" value="Add Date" />
</form>
<!-- Server side validation works -->
<p>@Html.ValidationSummary()</p>

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.16.0/jquery.validate.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.min.js"></script>

如何让&lt;span asp-validation-for="myModel.StartDate" class="validation"&gt;&lt;/span&gt; 使用 jQuery Unobtrusive Validation 在客户端显示错误消息?

【问题讨论】:

  • 我已经回答了你的问题,现在稍微更新了我的答案。完全按照描述进行操作。希望它能解决你的问题。
  • IValidatableObject 不提供客户端验证。为此,您需要一个ValidationAttribute iplmements IClientModelValidator(请参阅Model validation in ASP.NET Core MVC

标签: asp.net-mvc data-annotations unobtrusive-validation


【解决方案1】:

要在 ASP.NET/ASP.NET Core MVC 中获得自定义的非侵入式验证,您需要使用RemoteAttribute,如下所示:

第 1 步:您的模型类应如下所示:

public partial class MyModel : IValidatableObject
{
    [Required]
    public DateTime StartDate { get; set; }

    [Required]
    [Remote(action: "IsEndDateSmallerThanStartDate", controller: "Validation", AdditionalFields = nameof(StartDate), ErrorMessage = "End Date cannot be lesser than Start Date.")]
    public DateTime EndDate { get; set; }

   // This is for server side protection
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
       if (EndDate < StartDate)
       {
          yield return new ValidationResult(errorMessage: "End Date cannot be lesser than Start Date.", memberNames: new[] { "EndDate" });
       }
   }
}

第 2 步:然后在验证控制器中:

public class ValidationController : Controller
{
    public JsonResult IsEndDateSmallerThanStartDate(DateTime endDate, DateTime startDate)
    { 
        bool isEndDateGreaterThanStartDate =  endDate > startDate;
        return Json(isEndDateGreaterThanStartDate); // if isEndDateGreaterThanStartDate variable value is true, that means validation is successful, if false that means validation fails.
    }
}

记住您不需要任何 ViewModel,因此请移除 ViewModel。

Step-3 : 那么你的cshtml文件应该如下:

@model MyModel

<form asp-controller="AddDate" asp-action="Add" method="post">
    <!-- Server side validation works -->
    <p>@Html.ValidationSummary()</p>

    <label class="label">Start Date</label>
    <input asp-for="StartDate" class="form-control" />
    <span asp-validation-for="StartDate" class="validation"></span><br /><br />

    <label class="label">End Date</label>
    <input asp-for="EndDate" class="form-control" />
    <span asp-validation-for="EndDate" class="validation"></span>

    <input type="submit" value="Add Date" />
</form>

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.16.0/jquery.validate.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.min.js"></script>

希望现在一切都能按预期进行!

【讨论】:

  • 谢谢,但我的表单似乎不再提交了.. 它工作了一会儿,但即使结束日期不早于开始日期,错误也会出现。跨度>
  • 等我再检查一遍。
  • 它又开始工作了,原来我的动作和控制器设置错误。但是结束日期错误仍然出现,即使它不小于开始日期
  • 我已经更新了验证控制器。请检查。请调试验证控制器代码,并在 endDate 大于 startDate 时让我知道 isEndDateGreaterThanStartDate 变量值。
  • 请再次检查答案。我已经更新了用于服务器端验证保护的模型类。
猜你喜欢
  • 2016-11-21
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多