2011-10-06 3 views
6

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.

+0

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

+0

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

cevap

-1

ben editör şablonları kullanarak yerine foreach döngüleri yazma öneriyoruz.

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

ve ilgili düzenleyici şablonunda (~/Views/Shared/EditorTemplates/DeviceAttribute.cshtml): Ana görünümde Şimdi

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

: Ben ana görünümü modeli şuna benzer olduğunu varsayalım

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

Ve

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 
: En POST eylem görmek model geri alır

Şimdi varsayılan model bağlayıcı başarıyla görünümü modeli ve tekme doğrulama tüm değerleri bağlayacaktır.

İşte şablonları hakkında bir nice blog post bu. Belki de ValidationResult IsValid (nesne değeri, ValidationContext validationContext) 'geçersiz @protected geçersiz kılma deneyin

+0

geçirilen almaz. – Bardicer