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