没有@ Html.Button!


81

这很奇怪。我看到那里有@ Html.Button()的引用,但是当我键入Intellisense时,找不到这样的帮手...有下拉列表,隐藏的,编辑器等等,但没有按钮!

那是怎么回事?


您在哪里看到这样的参考?
SLaks 2011年

1
我了解对一致性的渴望,但实际上并不需要(无需进行编码或防范),因此,编写单个html标签的一种简便方法是:'@ Html.Button(“ myButton”,new {@class =“ myClass”})'vs'<button class =“ myClass”> myButton </ button>'
9尾,2015年

4
@Russel-我不同意-我在MvcHtmlString上创建了扩展方法来禁用,设置只读和隐藏DOM元素。因为没有用于按钮的HTML帮助器,所以无法使用扩展方法。说“没有需要”有点目光短浅,而且可能很幼稚。
barrypicker

Answers:


69
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());
  }
}

1
是的...他们一定有很好的理由,否则将是一个巨大的错误。
2011年

谢谢,我在一个新项目上,惊讶地发现没有html.button
汤姆·斯蒂克

7
如果您想使用@Html.Button("ButtonText", new {Name = "name", Value = "value" })格式,请添加此类:public static MvcHtmlString Button(this HtmlHelper helper, string text, object htmlAttributes) { return Button(helper, text, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); }
Mason240 2013年

1
好的@ Mason240。按照您的建议,我用超载更新了答案。
jessegavin

哇...我以前从未见过HtmlHelper.AnonymousObjectToHtmlAttributes
drzaus 2014年


9

为了扩展已接受的答案,因此您可以将提交按钮绑定到模型属性,但要使用不同的文本:

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

使用以下稍微修改的Button帮助程序类

/// <summary>
/// Via /programming/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);
    }
}

8

MVC5,Bootstrap版本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" }
)

这将生成一个看起来像按钮的链接。


2
什么是“ Bootstrap 3”?
ekkis 2014年

1
抱歉,我输入了错误的单词。当然,我的意思是引导程序。感谢ekkis。链接
Piotr Knut 2014年

1
这不会创建按钮,而是创建一个看起来像按钮的链接。
SMUsamaShah 2015年

2
对我来说,如果左括号与ActionLink不在同一行,则无法编译。
GaTechThomas

GaTechThomas。对,是真的。一切都应该在一行中。我将其重新格式化以使其更易于阅读。最好创建您自己的按钮(或其他按钮),但是如果您没有时间这样做或不担心它的外观,那么这是一个快速的解决方案。
Piotr Knut

1

Razor似乎没有“按钮” HTML助手。您可能会找到对自定义HTML帮助程序扩展的引用。

参见此处:http : //www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs


1
看起来不奇怪吗?尤其是琐碎的事,为什么不包括在内以保持完整性?
ekkis,2011年

我已经阅读了该文档,但无法使其正常工作。我已经将帮助程序放置在项目根目录中名为HtmlHelpers.cs的文件中,它包含带有静态静态方法HtmlHelpers的静态类,该方法带有一个公共静态方法,该方法返回一个字符串,该字符串的唯一参数是“此HtmlHelper帮助程序”。一切都会编译,.Button应该出现在Intellisense中,但是没有...我应该怎么做?
ekkis,2011年

1
您是否在视图顶部包括了扩展名称空间的import语句?多数民众赞成在这里的常见问题。你可能想确保你的意见汇编(右键单击项目,选择卸载右键单击编辑文件。 -集MvcBuildViews为true保存并关闭,然后右键单击并重新加载项目,并重新编译。
亚当Tuliper - MSFT

1
创建一个名为扩展名的文件夹。在此处添加htmlextensions.cs类(确保名称空间正确),然后在您的视图中使用:@using Yourapp.Extensions如果遇到问题,还可以使用记事本启用MvcBuildViews。
Adam Tuliper-MSFT

1
Ekkis,不确定您对项目做了什么,但是您需要执行以下操作来创建HtmlHelperExtension:1)创建一个静态类(我称为HtmlHelperExtensions)2)在该类中,创建公共方法,其注释为<Extension( )>,并带有正确的签名。3)返回MvcHtmlString.Create()。请参阅此帖子,以获取有用且实用的示例:stackoverflow.com/questions/4896439/action-image-mvc3-razor
Ben Finkel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.