public void GetFormattedWeek_ReturnsExpectedFormattedValue(int year, int month, int day, string expectedOutput) { // Arrange var detailsProvider = new DefaultCompositeMetadataDetailsProvider( Enumerable.Empty <IMetadataDetailsProvider>()); var key = ModelMetadataIdentity.ForType(typeof(DateTime)); var cache = new DefaultMetadataDetails(key, new ModelAttributes( Array.Empty <object>(), Array.Empty <object>(), Array.Empty <object>())); var provider = new EmptyModelMetadataProvider(); var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); var model = new DateTime(year, month, day); var modelExplorer = new ModelExplorer(provider, metadata, model); // Act var formattedValue = FormatWeekHelper.GetFormattedWeek(modelExplorer); // Assert Assert.Equal(expectedOutput, formattedValue); }
public override void Process(TagHelperContext context, TagHelperOutput output) { DefaultModelMetadata model = (DefaultModelMetadata)For.Metadata; string shortName = model.DisplayName ?? For.Name; string labelText = model.Placeholder ?? shortName; string description = model.Description ?? labelText; string propName = For.AngularPropertyName(); var labelTag = new TagBuilder("label"); labelTag.InnerHtml.Append(description); labelTag.MergeAttribute("for", propName); labelTag.AddCssClass("control-label"); var inputTag = new TagBuilder("input"); inputTag.AddCssClass("form-control"); inputTag.TagRenderMode = TagRenderMode.StartTag; inputTag.MergeAttribute("id", propName); inputTag.MergeAttribute("name", propName); inputTag.MergeAttribute("placeholder", model.Placeholder); inputTag.MergeAttribute("[(ngModel)]", For.AngularName()); string typeName = "text"; switch (model.DataTypeName) { default: break; case "Password": typeName = "password"; break; case "Currency": typeName = "number"; break; } inputTag.MergeAttribute("type", typeName); TagBuilder validationBox = new TagBuilder("div"); validationBox.MergeAttribute("class", "alert alert-danger"); validationBox.MergeAttribute("*ngIf", propName + ".errors && (" + propName + ".dirty || " + propName + ".touched)"); string regex = model.RegexExpression(); if (regex != string.Empty) { var regexValidation = new TagBuilder("div"); regexValidation.MergeAttribute("[hidden]", string.Format("!{0}.errors.pattern", propName)); regexValidation.InnerHtml.Append(string.Format("{0} введено неверно.", labelText)); validationBox.InnerHtml.AppendHtml(regexValidation); inputTag.Attributes.Add("pattern", ((DefaultModelMetadata)For.Metadata).RegexExpression()); } int?value = model.GetMinLength(); if (value != null) { var minLengthValidation = new TagBuilder("div"); minLengthValidation.MergeAttribute("[hidden]", string.Format("!{0}.errors.minlength", propName)); minLengthValidation.InnerHtml.Append(string.Format("{0} должно быть максимум {1} символ(а) длиной.", labelText, value)); validationBox.InnerHtml.AppendHtml(minLengthValidation); inputTag.Attributes.Add("minlength", value.ToString()); } value = model.GetMaxLength(); if (value != null) { var maxLengthValidation = new TagBuilder("div"); maxLengthValidation.MergeAttribute("[hidden]", string.Format("!{0}.errors.maxlength", propName)); maxLengthValidation.InnerHtml.Append(string.Format("{0} должно быть минимум {1} символ(а) длиной.", labelText, value)); validationBox.InnerHtml.AppendHtml(maxLengthValidation); inputTag.Attributes.Add("maxlength", value.ToString()); } // add validation box inputTag.MergeAttribute("#" + propName, "ngModel"); if (model.IsRequired) { inputTag.Attributes.Add("required", "required"); TagBuilder validationMsgBox = new TagBuilder("div"); validationMsgBox.MergeAttribute("[hidden]", "!" + propName + ".errors.required"); validationMsgBox.InnerHtml.Append(labelText + " поле обьязательно к заполнению!"); validationBox.InnerHtml.AppendHtml(validationMsgBox); } output.TagName = "div"; output.Attributes.Add("class", "form-group"); output.Content.AppendHtml(labelTag); switch (model.DataTypeName) { default: output.Content.AppendHtml(inputTag); break; case "Currency": { var divInputGroup = new TagBuilder("div"); divInputGroup.MergeAttribute("class", "input-group"); var divCurrencySign = new TagBuilder("div"); divCurrencySign.MergeAttribute("class", "input-group-addon"); divCurrencySign.InnerHtml.Append("$"); divInputGroup.InnerHtml.AppendHtml(divCurrencySign); divInputGroup.InnerHtml.AppendHtml(inputTag); output.Content.AppendHtml(divInputGroup); break; } } if (validationBox != null) { output.Content.AppendHtml(validationBox); } }
private bool HasAttribute(DefaultModelMetadata metadata, Type type) { return(metadata.Attributes.PropertyAttributes .Any(i => i.GetType() == type)); }
private static ValueProviderResult FindAlternateValue(ModelBindingContext bc, DefaultModelMetadata metadata) { var attrs = metadata.Attributes.Attributes .Where(a => a.GetType() == typeof(FromQueryWithAlternateNamesAttribute)) .Cast <FromQueryWithAlternateNamesAttribute>() .FirstOrDefault(); if (attrs is null) { return(ValueProviderResult.None); } foreach (var an in attrs.AlternateNames) { var vr = bc.ValueProvider.GetValue(an); if (vr != ValueProviderResult.None) { return(vr); } } return(ValueProviderResult.None); }