Я создал свой собственный пользовательский ValidationAttribute
:
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 не срабатывает. Есть идеи?
Edit: Дальнейшее расследование показало, что это происходит потому, что модель представления DeviceAttribute
на самом деле является моделью представления для частичного представления. Полной странице передается другая модель представления, которая содержит список моделей представления DeviceAttribute
. Поэтому, когда вызывается действие моего контроллера, модель представления полной страницы создается и ее значения заполняются, но модели представления DeviceAttribute
не создаются, поэтому валидация не выполняется.