从我几年前创建的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方法中,如何获取相同或类似的数据注释信息?或者更好的是,我怎么能以与上面类似的方式完全自动生成验证元素?
答案 0 :(得分: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,这没什么大不了的。只需让我继续开发这些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; }
}
现在创建验证<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 "";
}
如果有人知道更自动的创建验证标签的方法,和/或派生被验证的标签的属性,那么我的手动方法,我将非常感激。
随着我的代码和理解的发展,我将更新此解决方案。