Custom ValidationAttribute not firing IsValid function call in view model

Я создал свой собственный пользовательский 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 не создаются, поэтому валидация не выполняется.

6
задан dnatoli 6 October 2011 в 02:10
поделиться