C# MVC验证-更新另一个字段?

C# MVC验证-更新另一个字段?,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我们目前正在创建两个输入字段,其中包含开始和结束日期时间,每个字段中一个。我们目前正在进行验证,因此如果用户将开始时间放在结束时间之后(反之,将结束时间放在开始之前),它将显示一条错误消息。然而,我们遇到了一个有趣的问题 例如,如果用户将结束时间放在开始时间之前,我们会在结束时间收到一条错误消息 但是,如果随后修改了开始日期而不是结束日期,则消息将保留 是否有方法删除/更新/更正其他字段上的验证消息?以下是验证代码: [Required(ErrorMessage = "{0} is requ

我们目前正在创建两个输入字段,其中包含开始和结束日期时间,每个字段中一个。我们目前正在进行验证,因此如果用户将开始时间放在结束时间之后(反之,将结束时间放在开始之前),它将显示一条错误消息。然而,我们遇到了一个有趣的问题

例如,如果用户将结束时间放在开始时间之前,我们会在结束时间收到一条错误消息

但是,如果随后修改了开始日期而不是结束日期,则消息将保留

是否有方法删除/更新/更正其他字段上的验证消息?以下是验证代码:

[Required(ErrorMessage = "{0} is required!")]
[Display(Name = "Start Date")]
[Remote("IsTestPlanEndCorrect", "Analysis", AdditionalFields = "EndDate", HttpMethod = "Post", ErrorMessage = "Test Plan Start Time must be before End.")]
public System.DateTime StartDate { get; set; }

[Required(ErrorMessage = "{0} is required!")]
[Display(Name = "End Date")]
[Remote("IsTestPlanEndCorrect", "Analysis", AdditionalFields = "StartDate", HttpMethod = "Post", ErrorMessage = "Test Plan End Time must be after Start.")]
public System.DateTime EndDate { get; set; }
IsTestPlanEndCorrect
只是一种根据传递的数据是否通过验证返回true或false的方法

编辑: 字段的代码:

<div class="form-group">
@Html.LabelFor(t => t.StartDate, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
        @Html.TextBoxFor(t => t.StartDate, new { @class = "form-control datetimepicker", placeholder = "Enter Test Plan Start"})
        @Html.ValidationMessageFor(t => t.StartDate)
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(t => t.EndDate, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.TextBoxFor(t => t.EndDate, new { @class = "form-control datetimepicker", placeholder = "Enter Test Plan End"})
        @Html.ValidationMessageFor(t => t.EndDate)
    </div>
</div>

您可能希望/需要通过
jQuery
实现这一点:

$('#StartDate, #EndDate').change(function() {
    $('#StartDate, #EndDate').valid();
});

这将导致每次更改任一字段时,都对两个字段调用验证。您可能希望在此代码中添加一些额外的检查,例如,如果结束日期为空,您可能还不想检查它。

此行为的原因是您编辑的元素会触发jquery客户端验证(最初在
.blur()
上,然后在
.keyup()
上)。更改
StartDate
文本框中的值不会触发
EndDate
值的验证,它只会触发
StartDate
值的验证,因此验证消息不会消失

例如,您可以通过专门触发“其他”文本框中的
.keyup()
事件来解决此问题

$('#StartDate').change(function() {
    $('#EndDate').trigger('keyup'); // or $('#EndDate').valid();
});
$('#EndDate').change(function() {
    $('#StartDate').trigger('keyup'); // or $('#StartDate').valid();
});
但是,使用
RemoteAttribute
检查客户机中已知的值是一种资源浪费,每次更改值时,您将至少调用2次数据库。此外,远程验证仅限于客户端,您需要在POST方法中再次重复验证逻辑,并手动添加
modelstatererror
,以防止恶意用户

相反,使用实现
IClientValidatable
的自定义验证属性,这样您就可以在不需要ajax调用的情况下获得客户端和服务器端验证。有关实现您自己的功能的良好指南,请参阅。或者对于一个现成的解决方案,考虑使用<代码> [ GreaterThan ] < /代码>和<代码> [ LessThan ] < /代码>验证属性。请注意,通常将一个或另一个应用于其中一个属性,但如果确实要将其应用于两个属性,例如

[LessThan("EndDate")]
public DateTime StartDate { get; set; }
[GreaterThan("StartDate")]
public DateTime EndDate { get; set; }

然后您仍然需要触发上面提到的
.keyup()
事件以使另一条消息消失。

您的验证代码
istestplanendcrect
有什么作用?
Analysis
是具有
istestplanendcrect
方法的控制器的名称。你能分享一下密码吗?当您指定开始日期时,是否正在进行异步调用?我将更新我的POST。您为什么不使用MVC自定义验证属性?非常适合这种情况。这里有一个开始的指南:您知道是否可以将它链接到html验证?此解决方案看起来很理想,但我不确定如何将其与实际验证联系起来message@Novastorm抱歉,我太傻了。你是什么意思?如果您在前端使用jQuery验证(可能是因为远程验证),那么它应该可以自动执行。因此,您在UI上看到的验证消息来自我们的ViewModel(这是本文中的第一段代码)。我认为远程验证用于定义验证是在应用程序端而不是客户端执行的(因为在代码中调试断点时会命中此方法)。当我说将其链接回html验证时,我指的是您在UI中收到的消息(我在那里工作的选择太差了!)@Novastorm无需担心。验证是在服务器端为日期检查执行的,但是对/错的结果是在客户端处理的,如果无效,那么您将看到消息。从
jQuery
调用
.valid()
模拟了与自然切换相同的工作流。哦,我明白了!非常感谢,我来试试:)
[LessThan("EndDate")]
public DateTime StartDate { get; set; }
[GreaterThan("StartDate")]
public DateTime EndDate { get; set; }