Stworzyłem własną niestandardową ValidationAttribute
:klienta ValidationAttribute nie wypalanie IsValid wywołanie funkcji w modelu widoku
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));
}
}
używam, że na jednym z moich modeli i działa idealnie. Jednak teraz jestem próbuje użyć go na modelu Widok:
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 widok używanej w częściowym widokiem tak:
@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>
jakiegoś nieznanego powodu, podczas gdy konstruktor UrlValidationAttribute fires, funkcja IsValid nie uruchamia się. Jakieś pomysły?
Edit: Na dalszych badań, wydaje się, że to się dzieje, ponieważ model DeviceAttribute
widok jest rzeczywiście model widok na częściowe. Pełna strona jest przekazywana inny model widoku, który zawiera listę modeli widoku DeviceAttribute
. Kiedy wywoływana jest akcja kontrolera, model pełnego widoku strony jest konstruowany, a jego wartości są wypełniane, ale nie są tworzone modele widoku, dlatego nie jest wykonywane sprawdzanie poprawności.
Być może spróbuj przesłonić @protected override ValidationResult IsValid (wartość obiektu, ValidationContext validationContext) @ - jest to metoda, która powinna zostać zastąpiona dla ValidationAttribute. Uwaga: Upewnij się, że wywołasz ctor ValidationResult z informacjami o członku znalezionymi w kontekście sprawdzania poprawności. –
Próbowałem, że też, nie działa. Myślę, że ma to coś wspólnego z faktem, że jest to widok częściowy, więc 'List' nie jest przekazywany do kontrolera w celu sprawdzenia poprawności ... –
link664