I am migrating an application from ASP.NET 4.8 to ASP.NET Core 6.
I have the following in a ButtonExtensions class:
public static IHtmlContent HelpButton(this HtmlHelper htmlHelper, Enums.ButtonSize buttonSize = Enums.ButtonSize.Normal)
{
var button = new TagBuilder("button");
button.MergeAttribute("type", "button");
button.MergeAttribute("aria-label", "Help Button");
button.MergeAttribute("tabindex", "100");
button.AddCssClass("btn");
button.AddCssClass("btn-outline-info");
button.AddCssClass("btn-light");
button.AddCssClass("help-button");
if (buttonSize == Enums.ButtonSize.Small)
button.AddCssClass("btn-sm");
else if (buttonSize == Enums.ButtonSize.Large)
button.AddCssClass("btn-lg");
return BuildButton("Help", BuildInternalIconTag("fa-question-circle"), button);
}
I try to use it in an Index.cshtml file as so:
@Html.HelpButton()
I have the following in a FormLabelExtensions class:
public static IHtmlContent FormLabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
return FormLabelFor(htmlHelper, expression, null, htmlAttributes);
}
private static IHtmlContent FormLabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, string labelText, object htmlAttributes)
{
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (attributes.ContainsKey("class"))
attributes["class"] = $"{attributes["class"]} col-form-label";
else
attributes.Add("class", "col-form-label");
var modelExpressionProvider = htmlHelper.ViewContext?.HttpContext?.RequestServices?.GetService<ModelExpressionProvider>()
?? new ModelExpressionProvider(htmlHelper.MetadataProvider);
var modelExpression = modelExpressionProvider.CreateModelExpression(htmlHelper.ViewData, expression);
if (!modelExpression.Metadata.IsRequired)
return htmlHelper.LabelFor(expression, labelText, attributes);
if (attributes.ContainsKey("class"))
attributes["class"] = $"{attributes["class"]} required";
else
attributes.Add("class", "required");
return htmlHelper.LabelFor(expression, labelText, attributes);
}
I try to use it in an Index.cshtml file as so:
@Html.FormLabelFor(m => model)
Both give me the same error.
Looks like you just need to change HtmlHelper<TModel>
to use the interface version of that IHtmlHelper<TModel>
as this is the proper way in .NET Core.
For example:
public static IHtmlContent HelpButton(this IHtmlHelper htmlHelper, Enums.ButtonSize buttonSize = Enums.ButtonSize.Normal)
{
...
}