我创建自己的自定义ValidationAttribute
:定制ValidationAttribute在视图模型不点火的IsValid函数调用
public class UrlValidationAttribute : ValidationAttribute
{
public UrlValidationAttribute() {}
public override bool IsValid(object value)
{
if (value == null)
return true;
var text = value as string;
Uri uri;
return (!string.IsNullOrWhiteSpace(text) &&
Uri.TryCreate(text, UriKind.Absolute, out uri));
}
}
我使用的是在我的车型之一,它完美的作品。不过,现在我试图使用它在一个视图模型:
public class DeviceAttribute
{
public DeviceAttribute(int id, attributeDefinition, String url)
{
ID = id;
Url = url;
}
public int ID { get; set; }
[UrlValidation]
public String Url { get; set; }
}
视图模型在局部视图中使用这样的:
@model List<ICMDB.Models.DeviceAttribute>
<table class="editor-table">
@foreach (var attribute in Model)
{
<tr>
@Html.HiddenFor(a => attribute.ID)
<td class="editor-label">
@Html.LabelFor(a => attribute.Url)
</td>
<td class="editor-field">
@Html.TextBoxFor(a => attribute.Url)
@Html.ValidationMessageFor(a => attribute.Url)
</td>
</tr>
}
</table>
对于一些未知的原因,而构造函数UrlValidationAttribute触发,IsValid函数不会触发。有任何想法吗?
编辑:在进一步调查中,似乎发生了这种情况,因为DeviceAttribute
视图模型实际上是部分视图模型。整个页面将传递一个包含DeviceAttribute
视图模型列表的不同视图模型。因此,当我的控制器操作被调用时,将构建完整页面视图模型并填充其值,但不会构建视图模型,因此不会执行验证。
也许尝试覆盖@protected覆盖ValidationResult IsValid(对象值,ValidationContext validationContext)@ - 这是应覆盖ValidationAttribute的方法。注意:确保您使用验证上下文中的成员信息调用ValidationResult的ctor。 –
也试过了,没有工作。我认为这是一个事实,这是一个事实,这是在一个局部视图,所以'List'不传递回控制器进行验证... –
link664