public static MvcHtmlString Img(this HtmlHelper html, string src, string alt, string link = null, object htmlAttributes = null) { if (string.IsNullOrEmpty(src)) { return(MvcHtmlString.Empty); } if (src.StartsWith("~/")) { src = src.Replace("~/", VirtualPathUtility.ToAbsolute("~/")); } var tag = new TagBuilder("img"); tag.MergeAttribute("src", src.RewriteUrl()); tag.MergeAttribute("alt", alt); if (htmlAttributes != null) { tag.MergeAttributes(htmlAttributes.ToRouteValueDictionary()); } if (!string.IsNullOrEmpty(link)) { var a = new TagBuilder("a"); a.MergeAttribute("href", link); a.InnerHtml = tag.ToString(TagRenderMode.Normal); return(a.ToMvcHtmlString()); } return(tag.ToString(TagRenderMode.SelfClosing).ToMvcHtmlString()); }
private static MvcHtmlString ValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary <string, object> htmlAttributes) { //string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression); string modelName = expression; //FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation(); FormContext formContext = null; 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); } TagBuilder builder = new TagBuilder("span"); 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)); }
internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string labelText = null) { var resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); if (String.IsNullOrEmpty(resolvedLabelText)) { return(MvcHtmlString.Empty); } var tag = new TagBuilder("label"); tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlFieldName)); tag.SetInnerText(resolvedLabelText); return(tag.ToMvcHtmlString(TagRenderMode.Normal)); }
private static MvcHtmlString ValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary <string, object> htmlAttributes) { string modelName = expression; var fieldError = htmlHelper.GetFieldError(modelName); if (fieldError == null) { return(null); } var spanTag = new TagBuilder("span"); spanTag.MergeAttributes(htmlAttributes); HtmlHelper.ValidationMessageCssClassNames.Split(' ').Each(spanTag.AddCssClass); spanTag.AddCssClass(fieldError.ErrorCode); spanTag.InnerHtml = fieldError.Message; return(spanTag.ToMvcHtmlString(TagRenderMode.Normal)); }
public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary <string, object> htmlAttributes) { if (htmlHelper == null) { throw new ArgumentNullException("htmlHelper"); } var errorStatus = htmlHelper.GetErrorStatus(); if (errorStatus == null || errorStatus.Errors != null && errorStatus.Errors.Count > 0) { return(null); //just show individual field errors } var divTag = new TagBuilder("div"); HtmlHelper.ValidationSummaryCssClassNames.Split(' ').Each(divTag.AddCssClass); divTag.MergeAttributes(htmlAttributes); divTag.InnerHtml = errorStatus.Message; return(divTag.ToMvcHtmlString(TagRenderMode.Normal)); }
private static MvcHtmlString TextAreaHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, string name, IDictionary <string, object> rowsAndColumns, IDictionary <string, object> htmlAttributes) { string fullName = name; if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); } TagBuilder tagBuilder = new TagBuilder("textarea"); tagBuilder.MergeAttributes(htmlAttributes, true); tagBuilder.MergeAttributes(rowsAndColumns, rowsAndColumns != implicitRowsAndColumns); // Only force explicit rows/cols tagBuilder.MergeAttribute("name", fullName, true); // If there are any errors for a named field, we add the CSS attribute. ModelState modelState; htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState); string value; if (modelState != null && modelState.Value != null) { value = modelState.Value.AttemptedValue; } else if (modelMetadata.Model != null) { value = modelMetadata.Model.ToString(); } else { value = String.Empty; } // The first newline is always trimmed when a TextArea is rendered, so we add an extra one // in case the value being rendered is something like "\r\nHello". tagBuilder.SetInnerText(Environment.NewLine + value); return(tagBuilder.ToMvcHtmlString(TagRenderMode.Normal)); }
public static MvcHtmlString ValidationSuccess(this HtmlHelper htmlHelper, string message, IDictionary <string, object> htmlAttributes) { if (htmlHelper == null) { throw new ArgumentNullException("htmlHelper"); } var errorStatus = htmlHelper.GetErrorStatus(); if (message == null || errorStatus != null || htmlHelper.HttpRequest.HttpMethod == HttpMethods.Get) { return(null); } var divTag = new TagBuilder("div"); HtmlHelper.ValidationSuccessCssClassNames.Split(' ').Each(divTag.AddCssClass); divTag.MergeAttributes(htmlAttributes); divTag.InnerHtml = message; return(divTag.ToMvcHtmlString(TagRenderMode.Normal)); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata, string optionLabel, string name, IEnumerable <SelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { //string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); string fullName = name; if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData && defaultValue == null && !String.IsNullOrEmpty(name)) { defaultValue = htmlHelper.ViewData.Eval(name); } if (defaultValue != null) { selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple); } // Convert each ListItem to an <option> tag StringBuilder listItemBuilder = StringBuilderCache.Allocate(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); } foreach (SelectListItem item in selectList) { listItemBuilder.AppendLine(ListItemToOption(item)); } TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = StringBuilderCache.ReturnAndFree(listItemBuilder) }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", fullName, true /* replaceExisting */); tagBuilder.GenerateId(fullName); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); return(tagBuilder.ToMvcHtmlString(TagRenderMode.Normal)); }
// Helper methods private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary <string, object> htmlAttributes) { var fullName = name; if (String.IsNullOrEmpty(name)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); } var tagBuilder = new TagBuilder("input"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); tagBuilder.MergeAttribute("name", fullName, true); string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); bool usedModelState = false; switch (inputType) { case InputType.CheckBox: var modelStateWasChecked = htmlHelper.GetModelStateValue(fullName, typeof(bool)) as bool?; if (modelStateWasChecked.HasValue) { isChecked = modelStateWasChecked.Value; usedModelState = true; } goto case InputType.Radio; case InputType.Radio: if (!usedModelState) { var modelStateValue = htmlHelper.GetModelStateValue(fullName, typeof(string)) as string; if (modelStateValue != null) { isChecked = String.Equals(modelStateValue, valueParameter, StringComparison.Ordinal); usedModelState = true; } } if (!usedModelState && useViewData) { isChecked = htmlHelper.EvalBoolean(fullName); } if (isChecked) { tagBuilder.MergeAttribute("checked", "checked"); } tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); break; case InputType.Password: if (value != null) { tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); } break; default: var attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string)); tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName) : valueParameter), isExplicitValue); break; } if (setId) { tagBuilder.GenerateId(fullName); } return(tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing)); }
public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary <string, object> htmlAttributes) { if (htmlHelper == null) { throw new ArgumentNullException("htmlHelper"); } FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation(); if (htmlHelper.ViewData.ModelState.IsValid) { if (formContext == null) { // No client side validation return(null); } // TODO: This isn't really about unobtrusive; can we fix up non-unobtrusive to get rid of this, too? if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled && excludePropertyErrors) { // No client-side updates return(null); } } string messageSpan; if (!String.IsNullOrEmpty(message)) { TagBuilder spanTag = new TagBuilder("span"); spanTag.SetInnerText(message); messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine; } else { messageSpan = null; } StringBuilder htmlSummary = new StringBuilder(); TagBuilder unorderedList = new TagBuilder("ul"); IEnumerable <ModelState> modelStates = GetModelStateList(htmlHelper, excludePropertyErrors); foreach (ModelState modelState in modelStates) { foreach (ModelError modelError in modelState.Errors) { string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */); if (!String.IsNullOrEmpty(errorText)) { TagBuilder listItem = new TagBuilder("li"); listItem.SetInnerText(errorText); htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal)); } } } if (htmlSummary.Length == 0) { htmlSummary.AppendLine(HiddenListItem); } unorderedList.InnerHtml = htmlSummary.ToString(); TagBuilder divBuilder = new TagBuilder("div"); divBuilder.MergeAttributes(htmlAttributes); divBuilder.AddCssClass((htmlHelper.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal); if (formContext != null) { if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) { if (!excludePropertyErrors) { // Only put errors in the validation summary if they're supposed to be included there divBuilder.MergeAttribute("data-valmsg-summary", "true"); } } else { // client val summaries need an ID divBuilder.GenerateId("validationSummary"); formContext.ValidationSummaryId = divBuilder.Attributes["id"]; formContext.ReplaceValidationSummary = !excludePropertyErrors; } } return(divBuilder.ToMvcHtmlString(TagRenderMode.Normal)); }