2011-10-06 9 views
6

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.

+0

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. –

+0

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

Odpowiedz

-1

Polecam używać szablonów edytora, zamiast pisać pętle foreach. Przypuszczam, że głównym modelem widok wygląda mniej więcej tak:

public class MyViewModel 
{ 
    public List<DeviceAttribute> Devices { get; set; } 
    ... 
} 

Teraz w głównym widoku:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <table class="editor-table"> 
     @Html.EditorFor(x => x.Devices) 
    </table> 
    <input type="submit" value="OK" /> 
} 

i w szablonie odpowiada redaktor (~/Views/Shared/EditorTemplates/DeviceAttribute.cshtml):

@model DeviceAttribute 
<tr> 
    @Html.HiddenFor(x => x.ID) 

    <td class="editor-label"> 
     @Html.LabelFor(x => x.Url) 
    </td> 

    <td class="editor-field"> 
     @Html.TextBoxFor(x => x.Url)    
     @Html.ValidationMessageFor(x => x.Url) 
    </td> 
</tr> 

I działanie POST cofa model widoku:

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

Teraz domyślny segregator modelu pomyślnie powiąza wszystkie wartości w modelu widoku i sprawdzi poprawność kopnięcia.

Oto nice blog post o szablonach.

+0

Znaleziony to nie działa. – Bardicer

Powiązane problemy