1

数年前に作成した HtmlHelpers から移動して、開発中にマークアップされたカスタム Taghelper があります...

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

すべて正常に動作し、この出力は次のようになります...

    <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 の基本的な作成はできますが、追加/編集中のフィールドのデータ注釈にアクセスできません。

HtmlHelpers を使用すると、出力を自動的に作成するために、次のように htmlHelper.ValidationMessageFor() を使用できます...

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

TagHelper ProcessAsync メソッド内から、同じまたは類似のデータ注釈情報を取得するにはどうすればよいですか? または、さらに良いことに、上記と同様の方法で検証要素を完全に自動生成するにはどうすればよいですか?

4

1 に答える 1

1

**** 解決策 - 2016 年 3 月 13 日 ****

属性ModelExpressionを介して渡された を使用できます。asp-forより具体的には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 つのテーブルのみを使用していることを考えると、それは大きな制約ではありません。EF7 が完全に機能し、少し落ち着いたら、最終的に MVC 6 に移行するときに備えて、これらの 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 "";
    }

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

私のコードと理解が進むにつれて、このソリューションを更新します。

于 2016-04-13T09:22:45.677 に答える