2016-04-07 9 views
0

がHtmlHelpersから移動私は数年前に作成されたように、開発中にマークアップされているように、私はMVC 6カスタムTaghelper検証 - ソリューション

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

すべての罰金と出力動作します...そのTaghelperカスタムを持っています次のようにこれは...

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

は今、私は次のように出力に追加するために私自身の検証SPANを作り上げる助けを探していますのために...

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

とにかく、私はそのSPANの作成の基本をすることができますが、私は追加/編集されているフィールドのデータ注釈にアクセスすることはできません。どのように私は、同じまたは類似したデータを取得することができ、自動的に出力を作るためには、次のように私はhtmlHelper.ValidationMessageFor()を使用することができHtmlHelpersを使用して

... TagHelper ProcessAsyncメソッド内から

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

、注釈情報?あるいは、より良いことに、私はどのようにして上記と同様の方法で完全に検証要素を自動生成できますか?

+0

私はValidation TagHelpersを使いたくありません。 TagHelpersに移動する場合は、各フィールドのメインTagHelperで独自の検証出力を作成する必要があります。さもなければ私のコードはより簡潔ではなくより冗長になります。 – elphinum

+1

質問にjquery-validateタグが付いているのはなぜですか? – koolhuman

+0

迷惑メールにタグを付けないでください。質問はjQuery Validateプラグインとは関係がないので、このタグは使用しないでください。編集されました。ありがとう。 – Sparky

答えて

0

**** SOLUTION - 2016年3月13日****

あなたはasp-for属性を経由して渡されたModelExpressionを使用することができます。より具体的には、modExp.Metadata.ValidatorMetadataクラス。

以前の検証アノテーション方法がEF7ではまだ動作しないことが判明しました。少なくとも私が慣れていた方法ではない。今の

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

EF7は、追加データのアノテーションをサポートするまで、私は以下のように私のPOCOクラスで直接(開発/テストの目的のために今だけのために)私の注釈を作成する必要があります。私は新しいTagHelpersの作成に役立つテーブルを1つだけ使用していることを考えれば、大きな結束はありません。私はMVC 6への移行を最終的に行い、EF7が完全に機能して少し落ち着くと、これらのTagHelpersの開発を進めることができます。

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

今の私の検証<span data-...></span>を作成するためのコードは少し下のようになります。

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

検証されているタグの検証属性を取得するコードは以下のとおりです。これはちょうど今の初期の擬似コードです。私はおそらく後で更新します。

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

誰もが検証タグを作成するためのより自動的な方法を知っている、および/またはタグの属性を導出が検証されている場合は、ここで私の手動による方法よりも、私は非常に感謝することでしょう。

私のコードと理解が発展するにつれて、この解決策を更新します。