benim kendi özel ValidationAttribute
yarattık: my modelini seçebilirÖzel ValidationAttribute görünümü modelinde IsValid işlev çağrısını kovmuyorum
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));
}
}
Bunu kullanıyorum ve mükemmel çalışıyor. görünüm modeli şöyle kısmi görünümde kullanılan
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; }
}
: Ancak, şimdi bir görünüm modeline kullanmak çalışılıyor, Bilinmeyen bir nedenle
@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>
yapıcı için ise UrlValidationAttribute yangınları, IsValid işlevi çalışmıyor. Herhangi bir fikir?
Düzeltme: Daha fazla araştırmayla ilgili olarak, bu durumun gerçekleştiği anlaşılıyor, çünkü DeviceAttribute
görünüm modeli aslında bir kısmi görünüm modelidir. Tam sayfa, DeviceAttribute
görünüm modellerinin listesini içeren farklı bir görünüm modelinden geçirilir. Böylece, denetleyici eylemi çağrıldığında, tam sayfa görüntüleme modeli oluşturulur ve değerleri doldurulur, ancak hiçbir DeviceAttribute
görünüm modeli oluşturulmaz, bu nedenle doğrulama yapılmaz.
- Bu ValidationAttribute en için overriden gereken yöntemdir. Not: Doğrulama bağlamında bulunan üye bilgileri ile ValidationResult ctor çağırdığınızdan emin olun. –
Bunu denedim, işe yaramadı. Ben bu kısmi görünümde olması ile ilgili bir şey olduğunu düşünüyorum, bu yüzden 'Liste' geri bu işe yaramadı bulundu doğrulama için kontrolöre ... –
link664