从几年前创建的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的基础知识,但是我无法获得要添加/编辑的字段的数据注释。
使用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日****
您可以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,所以这没有什么大的束缚。请允许我继续开发这些TagHelpers,以准备在EF7完全发挥作用并稍作调整后最终过渡到MVC 6时使用。
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 "";
}
如果有人比我的手动方法更了解创建验证标签和/或派生待验证标签的属性的自动化方法,我将非常感激。
随着我的代码和理解的发展,我将更新此解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句