2016-04-07 15 views
0

HtmlHelpers hareketle Birkaç yıl önce oluşturulan böylece gelişimi sırasında işaretlenmiş gibi benMVC 6 Custom Taghelper Doğrulama - Çözüm

<gdropdown asp-for="Type_ID" asp-items="cboType_SelectOne"></gdropdown> 

tüm ince ve çıkış çalışıyor ... o Taghelper özel bir var Bunun için aşağıdaki gibi

<div> 
     <select id="Type_ID" name="Type_ID"> 
      <option value=-1> - Select One - </option> 
      <option value=9>Aux. Ext. Device</option> 
      <option value=28>Backup Device</option> 
      ... 
     </select> 
    </div> 

Şimdi ... aşağıdaki gibi çıkışa eklemek benim KENDİ doğrulama SPAN işçiliği yardım arıyorum ... olduğunu

<div> 
     <select id="Type_ID" name="Type_ID"> 
      <option value=-1> - Select One - </option> 
      <option value=9>Aux. Ext. Device</option> 
      <option value=28>Backup Device</option> 
      ... 
     </select> 

     <span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Type_ID"> 
      <span for="Type_ID">Req!</span> 
     </span> 
    </div> 

Her neyse, bu SPAN'ı oluşturma temellerini başarabilirim, ancak eklendiğim/düzenlendiği alan için veri ek açıklamalarına ulaşamıyorum. otomatik çıkış zanaat amacıyla aşağıdaki şekilde ben htmlHelper.ValidationMessageFor() kullanabilirsiniz HtmlHelpers kullanma

... TagHelper ProcessAsync yöntemine içinden

public static MvcHtmlString CustomLookupFor2<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TValue>> exp, string url, bool includeValidation, object options) 
    { 
     ... 
     if (includeValidation) sbCtrls.Append(htmlHelper.ValidationMessageFor(expression)); 
     ... 
    } 

, nasıl aynı veya benzer verilere alabilirsiniz ek açıklama bilgisi Ya da daha iyisi, validasyon elemanını yukarıdaki gibi aynı şekilde nasıl otomatik olarak oluşturabilirim?

+0

Doğrulama TagHelpers kullanmak istemiyorum. TagHelpers'a taşınacak olursam, her alanın ana TagHelper'ının kendi onaylama çıktısını oluşturmasını istiyorum. Aksi halde kodum daha fazla tersine karşı daha ayrıntılı hale gelecektir. – elphinum

+1

sorgunun jquery-validate etiketi neden var? – koolhuman

+0

Lütfen "spam" etiketlemeyin.Sorunun jQuery Validate eklentisiyle ilgisi olmadığından, bu etiketi kullanmayın. Düzenlenen. Teşekkürler. – Sparky

cevap

0

**** ÇÖZÜM - 13 Mar 2016 ****

kullanabilirsiniz asp-for özelliyle geçirilen ModelExpression. Daha spesifik olarak modExp.Metadata.ValidatorMetadata sınıfı.

Eski doğrulama ek açıklama yönteminin henüz EF7 ile çalışmadığını keşfettim. En azından modaya alışkın değilim. EF7 ek veri açıklamaları destekler kadar, ben aşağıdaki gibi doğrudan benim POCO sınıflarında (sadece şimdilik dev/test amaçlı olarak) benim ek açıklamaları oluşturmak zorunda olacak Şimdilik

[MetadataType(typeof(IT_AssetValidation))] 
    public partial class IT_Asset 
    { 
     public class IT_AssetValidation 
     { 
      [Range(1, 1000000, ErrorMessage = "Req!")] 
      public string Product_ID { get; set; } 

      [Required(ErrorMessage = "Req!")] 
      public string Date_Acquired { get; set; } 
     } 
    } 

. Yeni TagHelper'larımın yaratılmasına yardımcı olmak için sadece bir tablo kullanıyorum, bu büyük bir bağ değil. Sadece bu TagHelper'ları geliştirmeye devam etmeme izin verin, nihayet, EF7 tamamen işlevsel ve biraz yerleştiğinde MVC 6'ya geçiş yaptığımda.

public partial class IT_Asset 
    { 
     public int Asset_ID { get; set; } 

     [Required(ErrorMessage = "Req!")] 
     public DateTime? Date_Acquired { get; set; } 

     [Range(1, 1000000, ErrorMessage = "Req!")] 
     public int? Product_ID { get; set; } 
    } 

aşağıda gibi küçük bakacağız artık benim doğrulama <span data-...></span> oluşturmak için kodu.

public static TagBuilder ValidationTag(ModelExpression modExp) 
    { 
     if ((modExp != null) && (modExp.Metadata.ValidatorMetadata.Count > 0)) 
     { 
      //Construct the HTML span template 
      var valTag = new TagBuilder("span"); 
      valTag.Attributes.Add("class", ""); 
      valTag.Attributes.Add("data-valmsg-for", modExp.Name); 

      return valTag; 
     } 
     else return null; 
    } 

Doğrulanan etiketin doğrulama özniteliklerini türetme kodu aşağıdaki gibidir. Bu, şimdi erken bir sözde kod. Belki daha sonra güncellenir.

public static string ValidationAttributes(ModelExpression modExp) 
    { 
     if ((modExp != null) && (modExp.Metadata.ValidatorMetadata.Count > 0)) 
     { 
      var ruleAttributes = new StringBuilder(); 

      //*PSUEDO CODE* Return the rules 
      foreach(...) { 
       If (REQ) ruleAttributes.Append(REQ attribute) 
       If (RANGE) ruleAttributes.Append(RANGE attribute) 
       etc. etc. 
      } 

      return ruleAttributes.ToString(); 
     } 
     else return ""; 
    } 

herkes doğrulama etiketi oluşturarak daha otomatik bir şekilde bilir ve/veya burada manuel yöntemle daha doğrulanan etiket için özelliklerini türetmek, ben çok memnun olurum.

Bu çözümü kodum ve anlayışım geliştikçe güncelleyeceğim.