【发布时间】:2012-07-26 18:40:58
【问题描述】:
我已经为单个属性进行了客户端验证,但是,我想使用客户端验证在模型级别(2 个或更多属性)进行验证。
我正在使用@Html.ValidationSummary(true) 来显示我创建的模型属性的验证错误。
但是,当生成模型错误时,它不会显示消息。它会阻止执行操作,但不会显示错误。
有人知道为什么会这样吗?
我的直觉是它与客户端验证有关,因为在这种情况下服务器端不起作用,因为我必须使用 Ajax 表单。
任何建议将不胜感激!
模型属性
public class AuditDetailValidatorAttribute : ValidationAttribute, IClientValidatable
{
public AuditDetailValidatorAttribute()
{
ErrorMessage = "Must select an NCN level...";
}
public override bool IsValid(object value)
{
AuditRequirementDetail audit = value as AuditRequirementDetail;
if (audit == null || audit.AuditResult.Id == 0 || audit.AssessmentLevel.Id == 0)
{
return true;
}
else
{
return !(audit.AuditResult.Id == 4 && audit.AssessmentLevel.Id == 1);
}
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
return new List<ModelClientValidationRule>
{
new ModelClientValidationRule
{
ValidationType = "required",
ErrorMessage = this.ErrorMessage
}
};
}
}
模型类
[AuditDetailValidator]
public class AuditRequirementDetail
{
// Constructor
public AuditRequirementDetail()
{
// instantiate the contained objects on AuditRequirementDetail creation
AssessmentLevel = new AssessmentLevel();
AuditResult = new AuditResult();
Requirement = new RequirementDetail();
Attachment = new Attachment();
Counter = 0;
}
/* rest of the code */
}
查看
@model pdiqc.Models.AuditRequirement.AuditRequirementDetail
@{
var SuccessTarget = "success" + Model.DetailID;
var IsValidTarget = "IsValid" + Model.DetailID;
var PerformCompletedTarget = "PerformCompleted" + Model.DetailID;
var AuditResultTarget = "AuditResult_Id" + Model.DetailID;
var AssessmentLevelTarget = "AssessmentLevel_Id" + Model.DetailID;
var DesignatorTarget = "Designator_Id" + Model.DetailID;
var EvidenceTarget = "Evidence_Id" + Model.DetailID;
var AttachmentTarget = "Attachments_Id" + Model.DetailID;
var AuditResultReferral = "#" + AuditResultTarget;
var AssessmentLevelReferral = "#" + AssessmentLevelTarget;
var DesignatorReferral = "#" + DesignatorTarget;
var EvidenceReferral = "#" + EvidenceTarget;
var AttachmentReferral = "#" + AttachmentTarget;
}
@using (Ajax.BeginForm("PerformRequirement", "Audit", new AjaxOptions { HttpMethod = "POST", OnSuccess = "success" }, new {Class="PerformReqForm" }))
{
@Html.ValidationSummary(true)
if ((Model.AuditResult.Id == 1 && Model.AssessmentLevel.Id > 1) || Model.Evidence == string.Empty || Model.Evidence == null)
{
<input class="@IsValidTarget" name="IsValid" type="hidden" value=false />
}
else
{
<input class="@IsValidTarget" name="IsValid" type="hidden" value=true />
}
<p class="reqText">@Model.RequirementLabel.ConfigurableLabelDesc #@ViewBag.PerformCounter - @ModelMetadata.FromLambdaExpression(x => x.Requirement.Text, ViewData).SimpleDisplayText</p>
<div class="hide">
/* REST OF CODE */
}
【问题讨论】:
-
您要在哪些属性上应用验证?
-
这里是我验证的属性:return !(audit.AuditResult.Id == 4 && audit.AssessmentLevel.Id == 1);
-
基本上,如果 "auditresult.id" 为 4 AND audit.assessmentlevel.id 为 1,则模型无效。
-
您是否尝试过在
IsValid()方法中添加断点并检查其是否按照您的要求工作? -
嗯,我知道它正在工作。成功时它会成功写入数据库。我上面的验证阻止它写入数据库。问题是错误消息不显示。因此,当您单击提交按钮时,什么也没有发生。我希望显示一条错误消息。
标签: html asp.net-mvc-3 validation client-side unobtrusive-javascript