【问题标题】:MVC 6 Custom Taghelper Validation - SolutionMVC 6 自定义 Taghelper 验证 - 解决方案
【发布时间】:2016-07-28 15:23:56
【问题描述】:

从我几年前创建的 HtmlHelpers 移出,我有一个自定义 Taghelper,在开发过程中标记为 so...

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

现在我正在寻求帮助来制作我的 OWN 验证 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 方法中获取相同或相似的数据注释信息?或者更好的是,如何以与上述类似的方式完全自动生成验证元素?

【问题讨论】:

  • 我不想使用验证 TagHelpers。如果我要转移到 TagHelpers,我希望每个字段的主要 TagHelper 都创建它自己的验证输出。否则我的代码会变得更冗长而不是更简洁。
  • 为什么这个问题有 jquery-validate 标签?
  • 请不要标记垃圾邮件。由于该问题与 jQuery Validate 插件无关,因此请勿使用此标签。已编辑。谢谢。
  • 我在 StackOverflow 上的第一篇文章。如果您觉得我错误地表达了我的查询,我们深表歉意。老实说,我确实认为这与该 jquery.validate 插件有关,因为我使用该特定技术作为该解决方案的一部分。这是解决方案的根本。

标签: validation asp.net-core-mvc tag-helpers


【解决方案1】:

**** 解决方案 - 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,这没什么大不了的。只允许我继续开发这些 TagHelper,为我最终过渡到 MVC 6 做好准备,一旦 EF7 功能齐全并稍微稳定下来。

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

目前用于创建我的验证&lt;span data-...&gt;&lt;/span&gt; 的代码如下所示。

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

如果有人知道创建验证标签和/或为正在验证的标签派生属性的更自动的方法,而不是我在这里的手动方法,我将非常感激。

随着我的代码和理解的发展,我将更新此解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2012-09-26
    • 2010-12-07
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多