標籤:
上次使用C#擴充方法,對HtmlHelper進行擴充。但是Html.ValidationMessageFor並沒有對日期非空驗證提示。
查看源碼的時候發現對比自己產生的input,多了data-val這些屬性。那麼只需要在產生input的時候加上該屬性即可。
var vas = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata);
tagBuilder.MergeAttributes(vas);
完整代碼如下:
public static MvcHtmlString CalendarFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { TagBuilder tagBuilder = new TagBuilder("input"); ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData); string name = ExpressionHelper.GetExpressionText(expression); htmlHelper.ValidateFor(expression); tagBuilder.MergeAttribute("name", name); tagBuilder.GenerateId(name); tagBuilder.MergeAttribute("type", "text"); //核心代碼,直接通過這個方法可以擷取屬性上的驗證資訊,如:“data-val= ....”。 var vas = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata); //string類型,看有沒長度限制,如果有,增加maxlength,minlength if (metadata.ModelType == typeof(string)) { var len = metadata.ContainerType.GetProperty(name).GetCustomAttribute(typeof(StringLengthAttribute)); if (len != null) { var stringlength = (StringLengthAttribute)len; if (stringlength.MaximumLength > 0) { tagBuilder.MergeAttribute("maxlength", stringlength.MaximumLength.ToString()); } if (stringlength.MinimumLength > 0) { tagBuilder.MergeAttribute("minlength", stringlength.MinimumLength.ToString()); } } } //如果model值不為,null,進行賦值。 if (metadata.Model != null) { tagBuilder.MergeAttribute("value", metadata.Model.ToString()); } tagBuilder.MergeAttributes(vas); tagBuilder.MergeAttribute("class", "Wdate"); tagBuilder.MergeAttribute("onclick", "WdatePicker({el:‘" + name + "‘})"); return new MvcHtmlString(tagBuilder.ToString()); }
這樣大功告成。
MVC中My97date無法進行ValidationMessage修改