MVC 6 自定义 Taghelper 验证 - 解决方案
MVC 6 Custom Taghelper Validation - Solution
从我几年前创建的 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>
现在我正在寻求帮助来制作我的 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 的基础知识,但是我无法获取正在 added/edited 的字段的数据注释。
使用 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 方法中获取相同或相似的数据注释信息?或者更好的是,我如何才能以与上述类似的方式完全自动生成验证元素?
**** 解决方案 - 2016 年 3 月 13 日 ****
您可以使用通过 asp-for
属性传入的 ModelExpression
。更具体地说 modExp.Metadata.ValidatorMetadata
class。
我发现旧的验证注释方法还不适用于 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 classes 中创建我的注释(目前仅用于 dev/test 目的),如下所示。考虑到我只使用一个 table 来帮助创建我的新 TagHelper,所以这没什么大不了的。只是允许我继续开发这些 TagHelpers,以便在我最终过渡到 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; }
}
目前用于创建验证 <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 "";
}
如果有人知道比我这里的手动方法更自动的创建验证标签的方法,and/or 派生被验证标签的属性,我将不胜感激。
随着我的代码和理解的发展,我将更新此解决方案。
从我几年前创建的 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>
现在我正在寻求帮助来制作我的 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 的基础知识,但是我无法获取正在 added/edited 的字段的数据注释。
使用 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 方法中获取相同或相似的数据注释信息?或者更好的是,我如何才能以与上述类似的方式完全自动生成验证元素?
**** 解决方案 - 2016 年 3 月 13 日 ****
您可以使用通过 asp-for
属性传入的 ModelExpression
。更具体地说 modExp.Metadata.ValidatorMetadata
class。
我发现旧的验证注释方法还不适用于 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 classes 中创建我的注释(目前仅用于 dev/test 目的),如下所示。考虑到我只使用一个 table 来帮助创建我的新 TagHelper,所以这没什么大不了的。只是允许我继续开发这些 TagHelpers,以便在我最终过渡到 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; }
}
目前用于创建验证 <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 "";
}
如果有人知道比我这里的手动方法更自动的创建验证标签的方法,and/or 派生被验证标签的属性,我将不胜感激。
随着我的代码和理解的发展,我将更新此解决方案。