2011-10-06 5 views
6

ho creato la mia personalizzato ValidationAttribute:personalizzato ValidationAttribute non sparare chiamata di funzione IsValid in vista del modello

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)); 
    } 
} 

Sto usando che su uno dei miei modelli e funziona perfettamente. Tuttavia, ora sto cercando di usarlo su un modello di vista:

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; } 
} 

Il modello vista viene utilizzato nella vista parziale in questo modo:

@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> 

Per qualche motivo sconosciuto, mentre il costruttore per UrlValidationAttribute si attiva, la funzione IsValid non viene attivata. Qualche idea?

Modifica: Su ulteriori indagini, sembra che ciò stia accadendo perché il modello di vista DeviceAttribute è in realtà il modello di vista per un parziale. Alla pagina intera viene passato un modello di visualizzazione diverso che contiene l'elenco dei modelli di visualizzazione DeviceAttribute. Quindi, quando viene chiamata l'azione del mio controller, viene costruito il modello di visualizzazione di pagina completa e vengono riempiti i suoi valori, ma non vengono creati modelli di visualizzazione DeviceAttribute, quindi perché non viene eseguita alcuna convalida.

+0

Forse provare a sovrascrivere @protected override ValidationResult IsValid (valore oggetto, ValidationContext validationContext) @ - questo è il metodo che deve essere sovrascritto per ValidationAttribute. NB: assicurati di chiamare il responsabile di ValidationResult con le informazioni sui membri trovate nel contesto di convalida. –

+0

Ho provato anche quello, non ha funzionato. Penso che sia qualcosa a che fare con il fatto che questa è in una vista parziale, quindi la 'Lista ' non viene restituita al controller per la convalida ... – link664

risposta

-1

Si consiglia di utilizzare i modelli di editor anziché la scrittura di cicli foreach. Suppongo che la tua vista del modello principale simile a questa:

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

Ora nella visualizzazione principale:

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

e nel modello corrispondente editor di (~/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> 

E la tua azione POST riprende il modello di vista:

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

Ora il raccoglitore modello predefinito associa correttamente tutti i valori nel modello di vista e la convalida degli scatti.

Ecco uno nice blog post sui modelli.

+0

Trovato ciò non ha funzionato. – Bardicer

Problemi correlati