There's no @Html.Button !

.Netasp.net Mvc-3RazorHtml HelperHtmlbutton

.Net Problem Overview


this is weird. I see references out there for @Html.Button() but when I type that Intellisense doesn't find such a helper... there's dropdownlist, hidden, editors, et cetera, but no button!

what's up with that?

.Net Solutions


Solution 1 - .Net

public static class HtmlButtonExtension 
{

  public static MvcHtmlString Button(this HtmlHelper helper, 
                                     string innerHtml, 
                                     object htmlAttributes) 
  { 
    return Button(helper, innerHtml,
                  HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
    ); 
  }

  public static MvcHtmlString Button(this HtmlHelper helper, 
                                     string innerHtml,
                                     IDictionary<string, object> htmlAttributes)
  {
      var builder = new TagBuilder("button");
      builder.InnerHtml = innerHtml;
      builder.MergeAttributes(htmlAttributes);
      return MvcHtmlString.Create(builder.ToString());
  }
}

Solution 2 - .Net

There is no button helper as of mvc preview 3 (not mvc3)

it was mentioned a bunch in the past for example: http://blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/ however rolling your own is trivial - I have a basis for it somewhere around here I'll have to dig it up, but essentially just create a new Html.ButtonFor and copy the source code from Html.LabelFor and change the output to create an input type="button" tag.

Solution 3 - .Net

To expand on the accepted answer, so you can bind a submit button to a model property but have different text:

@Html.ButtonFor(m => m.Action, Model.LabelForCurrentAction(), new { @class = "btn btn-primary btn-large", type = "submit" })

Using the following slightly modified Button helper class:

/// <summary>
/// Via https://stackoverflow.com/questions/5955571/theres-no-html-button
/// </summary>
public static class HtmlButtonExtension
{

	public static MvcHtmlString Button(this HtmlHelper helper, object innerHtml, object htmlAttributes)
	{
		return helper.Button(innerHtml, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
	}
	
	public static MvcHtmlString Button(this HtmlHelper helper, object innerHtml, IDictionary<string, object> htmlAttributes)
	{
		var builder = new TagBuilder("button") { InnerHtml = innerHtml.ToString() };
		builder.MergeAttributes(htmlAttributes);
		return MvcHtmlString.Create(builder.ToString());
	}

	public static MvcHtmlString ButtonFor<TModel, TField>(this HtmlHelper<TModel> html,
														Expression<Func<TModel, TField>> property,
														object innerHtml,
														object htmlAttributes)
	{
		// lazily based on TextAreaFor

		var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
		
		var name = ExpressionHelper.GetExpressionText(property);
		var metadata = ModelMetadata.FromLambdaExpression(property, html.ViewData);

		string fullName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

		ModelState modelState;
		if (html.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0)
		{
			if( !attrs.ContainsKey("class") ) attrs["class"] = string.Empty;
			attrs["class"] += " " + HtmlHelper.ValidationInputCssClassName;
			attrs["class"] = attrs["class"].ToString().Trim();
		}
		var validation = html.GetUnobtrusiveValidationAttributes(name, metadata);
		if(null != validation) foreach(var v in validation) attrs.Add(v.Key, v.Value);

		string value;
		if (modelState != null && modelState.Value != null)
		{
			value = modelState.Value.AttemptedValue;
		}
		else if (metadata.Model != null)
		{
			value = metadata.Model.ToString();
		}
		else
		{
			value = String.Empty;
		}
		
		attrs["name"] = name;
		attrs["Value"] = value;
		return html.Button(innerHtml, attrs);
	}
}

Solution 4 - .Net

MVC5 , Bootstrap ver 3.2.0

@Html.ActionLink
(
    linkText: " Remove", 
    actionName: "Index", 
    routeValues: null, // or to pass some value -> routeValues: new { id = 1 },
    htmlAttributes: new { @class = "btn btn-success btn-sm glyphicon glyphicon-remove" }
)

This will generate a link that looks like a button.

Solution 5 - .Net

Razor does not appear to have a "Button" HTML helper. You're likely finding references to a custom-built HTML helper extension.

See here: http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionekkisView Question on Stackoverflow
Solution 1 - .NetjessegavinView Answer on Stackoverflow
Solution 2 - .NetAdam TuliperView Answer on Stackoverflow
Solution 3 - .NetdrzausView Answer on Stackoverflow
Solution 4 - .NetPiotr KnutView Answer on Stackoverflow
Solution 5 - .NetBen FinkelView Answer on Stackoverflow