protected void ValidateModelState() { if (!ModelState.IsValid) { ModelErrorCollection modelErrorList = ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).FirstOrDefault(); ModelError modelError = modelErrorList?.FirstOrDefault(); if (modelError != null) { throw modelError.Exception; } } }
/// <summary> /// 根据指定的属性名或模型对象的名称,从模型错误中显示一个错误信息对应的HTML标记。 /// </summary> /// <param name="helper">HTML帮助器实例。</param> /// <param name="modelName">所验证的属性或模型对象的名称。</param> /// <param name="htmlAttributes">包含元素 HTML 特性的对象。</param> /// <returns></returns> public static MvcHtmlString PropertyValidationMessage(this HtmlHelper helper, string modelName, object htmlAttributes) { modelName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(modelName); if (!helper.ViewData.ModelState.ContainsKey(modelName)) { return(null); } ModelState modelState = helper.ViewData.ModelState[modelName]; ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; ModelError modelError = (((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]); if (modelError == null) { return(null); } TagBuilder builder = new TagBuilder("label"); builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); builder.AddCssClass("error"); builder.MergeAttribute("id", $"{modelName}-error"); builder.MergeAttribute("for", modelName); var iTag = new TagBuilder("i"); iTag.AddCssClass("fa fa-times-circle"); builder.InnerHtml = iTag.ToString(TagRenderMode.Normal) + GetUserErrorMessageOrDefault(helper.ViewContext.HttpContext, modelError, modelState); return(new MvcHtmlString(builder.ToString(TagRenderMode.Normal))); }
private static MvcHtmlString ValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary <string, object> htmlAttributes, string tag) { string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation(); if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName) && formContext == null) { return(null); } ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; ModelError modelError = (((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]); if (modelError == null && formContext == null) { return(null); } if (String.IsNullOrEmpty(tag)) { tag = htmlHelper.ViewContext.ValidationMessageElement; } TagBuilder builder = new TagBuilder(tag); builder.MergeAttributes(htmlAttributes); builder.AddCssClass((modelError != null) ? HtmlHelper.ValidationMessageCssClassName : HtmlHelper.ValidationMessageValidCssClassName); if (!String.IsNullOrEmpty(validationMessage)) { builder.SetInnerText(validationMessage); } else if (modelError != null) { builder.SetInnerText(GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState)); } if (formContext != null) { bool replaceValidationMessageContents = String.IsNullOrEmpty(validationMessage); if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) { builder.MergeAttribute("data-valmsg-for", modelName); builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant()); } else { FieldValidationMetadata fieldMetadata = ApplyFieldValidationMetadata(htmlHelper, modelMetadata, modelName); // rules will already have been written to the metadata object fieldMetadata.ReplaceValidationMessageContents = replaceValidationMessageContents; // only replace contents if no explicit message was specified // client validation always requires an ID builder.GenerateId(modelName + "_validationMessage"); fieldMetadata.ValidationMessageId = builder.Attributes["id"]; } } return(builder.ToMvcHtmlString(TagRenderMode.Normal)); }
public static MvcHtmlString ValidationMessageCustom(this HtmlHelper htmlHelper, string modelName) { //<span class="text-danger field-validation-error" data-valmsg-for="@field.Name" data-valmsg-replace="true"> //@if(!ViewData.ModelState.IsValid && ViewData.ModelState[field.Name] != null && ViewData.ModelState[field.Name].Errors.Count > 0) //{ // <span for= "@field.Name" class="">@ViewData.ModelState[field.Name].Errors.First().ErrorMessage</span> //} //</span> TagBuilder builder = new TagBuilder("span"); builder.AddCssClass("text-danger"); builder.AddCssClass("field-validation-error"); builder.Attributes.Add("data-valmsg-for", modelName); builder.Attributes.Add("data-valmsg-replace", "true"); ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; ModelError modelError = (((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]); if (htmlHelper.ViewData.ModelState.IsValid && modelError != null) { TagBuilder errorMessageSpan = new TagBuilder("span"); errorMessageSpan.Attributes.Add("for", modelName); errorMessageSpan.SetInnerText(modelError.ErrorMessage); builder.InnerHtml = errorMessageSpan.ToString(); } return(MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal))); }
private static MvcHtmlString CollectionValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, IDictionary <string, object> htmlAttributes, string tag) { bool isClientSideValidationEnabled = htmlHelper.ViewContext.ClientValidationEnabled; string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); if (!htmlHelper.ViewData.ModelState.ContainsKey(propertyName) && !isClientSideValidationEnabled) { return(null); } ModelState modelState = htmlHelper.ViewData.ModelState[propertyName]; ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; ModelError modelError = (((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]); if (modelError == null && !isClientSideValidationEnabled) { return(null); } if (String.IsNullOrEmpty(tag)) { tag = "span"; } TagBuilder html = new TagBuilder(tag); html.MergeAttributes(htmlAttributes); html.AddCssClass((modelError != null) ? HtmlHelper.ValidationMessageCssClassName : HtmlHelper.ValidationMessageValidCssClassName); if (modelError != null) { html.InnerHtml = modelError.ErrorMessage; } if (isClientSideValidationEnabled) { Dictionary <string, object> validationAttributes = GetValidationAttributes(modelMetadata); html.MergeAttributes(validationAttributes); html.MergeAttribute("data-col-message-for", propertyName); } return(MvcHtmlString.Create(html.ToString())); }
private static MvcHtmlString ExtendedValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary <string, object> htmlAttributes) { var mvcHtmlString = ValidationMessageHelper(htmlHelper, modelMetadata, expression, validationMessage, htmlAttributes); string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); FormContext formContext = GetFormContextForClientValidation(htmlHelper.ViewContext); if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName) && formContext == null) { return(mvcHtmlString); } ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; var extendedModelState = modelState as ExtendedModelState; ModelErrorCollection modelWarnings = null; if (extendedModelState == null) { return(mvcHtmlString); } modelWarnings = extendedModelState.Warnings; ModelError modelWarning = (((modelWarnings == null) || (modelWarnings.Count == 0)) ? null : modelWarnings.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelWarnings[0]); if (modelWarning == null) { return(mvcHtmlString); } var builder = new TagBuilder("span"); builder.MergeAttributes(htmlAttributes); builder.AddCssClass(modelWarning != null ? HtmlHelpers.ValidationSummaryWarningCssClassName : HtmlHelper.ValidationMessageValidCssClassName); builder.SetInnerText(GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelWarning, modelState)); if (formContext != null) { bool replaceValidationMessageContents = String.IsNullOrEmpty(validationMessage); if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) { builder.MergeAttribute("data-valmsg-for", modelName); builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant()); } else { FieldValidationMetadata fieldMetadata = ApplyFieldValidationMetadata(htmlHelper, modelMetadata, modelName); // rules will already have been written to the metadata object fieldMetadata.ReplaceValidationMessageContents = replaceValidationMessageContents; // only replace contents if no explicit message was specified // client validation always requires an ID builder.GenerateId(modelName + "_validationMessage"); fieldMetadata.ValidationMessageId = builder.Attributes["id"]; } } var mvcHtmlStringWithWarning = MvcHtmlString.Create((mvcHtmlString == null ? string.Empty : mvcHtmlString.ToHtmlString()) + builder.ToString(TagRenderMode.Normal)); return(mvcHtmlStringWithWarning); }