我有以下看法模式:
public class Search {
public int Id { get; set; }
[Required(ErrorMessage = "Please choose a name.")]
public string Name { get; set; }
[ValidGroup(ErrorMessage = "Please create a new group or choose an existing one.")]
public Group Group { get; set; }
}
public class Group {
public int Id { get; set; }
public string Name { get; set; }
}
我对习俗鉴定作了如下定义:
public class ValidGroupAttribute : ValidationAttribute {
public override bool IsValid(object value) {
if (value == null)
return false;
Group group = (Group)value;
return !(string.IsNullOrEmpty(group.Name) && group.Id == 0);
}
}
我有以下看法(一些简短的看法):
@Html.ValidationSummary()
<p>
<!-- These are custom HTML helper extensions. -->
@Html.RadioButtonForBool(m => m.NewGroup, true, "New", new { @class = "formRadioSearch", id = "NewGroup" })
@Html.RadioButtonForBool(m => m.NewGroup, false, "Existing", new { @class = "formRadioSearch", id = "ExistingGroup" })
</p>
<p>
<label>Group</label>
@if (Model.Group != null && Model.Group.Id == 0) {
@Html.TextBoxFor(m => m.Group.Name)
}
else {
@Html.DropDownListFor(m => m.Group.Id, Model.Groups)
}
</p>
问题Im是验证类别input-validation-error
,没有适用于专家组的投入。 我认为,这是因为该框架试图找到一个有<代码>id=“Group”的外地,而正在生成的标识有id=”Group_Id
或id=Group_Name
。 是否有办法应用这一类别?
http://f.cl.ly/items/0Y3R0W3Z193s3d1h3518/Capture.PNG
Update
I ve Trial implementing IValidatable 目标代码>在专家组看来是模型,而不是使用验证属性,但我仍然不能让中心级适用:
public class Group : IValidatableObject
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
if (string.IsNullOrEmpty(Name) && Id == 0) {
yield return new ValidationResult("Please create a new group or select an existing one.", new[] { "Group.Name" });
}
}
}
Update 2
自我验证不工作。 我认为,这是因为在MVC框架中使用的“ValidationResult中的第二个参数”。
http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2”rel=“nofollow noreferer” http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2
在某些情况下,你可能会被诱惑,使用第二座建筑商超载ValidationResult,其成员名数不一。 例如,你可以决定,你想要在这两个领域展示错误信息,这样,你就将守则改为:
return new ValidationResult( FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName, OtherProperty });
如果你执行你的法典,你将绝对没有任何区别。 这是因为,虽然这种超负荷存在,而且大概在其他地方使用。 NET框架,MVC框架完全无视ValidationResult。 成员