@ Html.Buttonはありません!


81

これは変です。@ Html.Button()の参照がありますが、Intellisenseがそのようなヘルパーを見つけられないと入力すると、ドロップダウンリスト、非表示、エディターなどがありますが、ボタンはありません。

どうしたの?


そのような参照はどこにありますか?
SLaks 2011年

1
私は一貫性の欲求を理解していますが、実際には必要はありません(エンコードしたり保護したりする必要はありません)ので、単一のhtmlタグを書くための長い方法です: '@ Html.Button( "myButton"、new {@class = "myClass"}) 'vs' <button class = "myClass"> myButton </ button> '
九尾の狐

4
@ Russel-同意しません-DOM要素を無効にし、読み取り専用にし、非表示にする拡張メソッドをMvcHtmlStringに作成しました。ボタンのHTMLヘルパーがないため、拡張メソッドを使用できません。「必要がない」と言うのは少し近視眼的で、おそらく素朴です。
barrypicker 2015

回答:


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
ええ...彼らには本当に正当な理由があったに違いありません。さもなければそれは大きな間違いでしょう。
アンドレイRînea

おかげで、私は新しいプロジェクトに参加していて、html.buttonがないことに驚いていました
Tom Stickel

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

1
@ Mason240までお電話ください。あなたが提案したように、私は過負荷で私の答えを更新しました。
jessegavin 2013年

おっと...どうして今まで見たことがないのHtmlHelper.AnonymousObjectToHtmlAttributes
drzaus 2014

9

mvcプレビュー3(mvc3ではない)の時点ではボタンヘルパーはありません

たとえば、過去にたくさん言及されていました:http//blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/ ただし、自分でローリングするのは簡単です-私には根拠がありますこのあたりのどこかでそれを掘り下げる必要がありますが、基本的には新しいHtml.ButtonForを作成し、Html.LabelForからソースコードをコピーし、出力を変更して入力type = "button"タグを作成します。


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 ver 3.2.0

これにより、ボタンのようなリンクが生成されます。


2
「ブートストラップ3」とは何ですか?
ekkis 2014年

1
すみません、間違った単語を入力しました。もちろん、私はブートストラップを意味します。ekkisに感謝します。リンク
Piotr Knut

1
これはボタンを作成せず、代わりにボタンのように見えるリンクを作成します。
SMUsamaShah 2015

2
私の場合、開始括弧がActionLinkと同じ行にない場合、これはコンパイルに失敗します。
GaTechThomas 2016年

GaTechThomas。はい、それは本当だ。すべてが1行になっている必要があります。読みやすいように再フォーマットしました。独自のボタン(または他の何か)を作成するのが最善ですが、それを行う時間がない場合、またはその外観について心配していない場合は、それが迅速な解決策であると考えてください。
Piotr Knut

1

Razorには「ボタン」HTMLヘルパーがないようです。カスタムビルドのHTMLヘルパー拡張機能への参照を見つける可能性があります。

ここを参照してください:http//www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs


1
それは奇妙に思えませんか?特にそれが些細なことなら、完全を期すためにそれを含めてみませんか?
ekkis

そのドキュメントを読みましたが、機能させることができません。プロジェクトのルートにあるHtmlHelpers.csというファイルにヘルパーを配置しました。このファイルには、「thisHtmlHelperhelper」のみのパラメーターを持つ文字列を返すパブリック静的メソッドを持つ静的クラスHtmlHelpersが含まれています。すべてがコンパイルされ、.ButtonがIntellisenseに表示されるはずですが、表示されません...他に何をする必要がありますか?
ekkis

1
ビューの上部に拡張名前空間のインポートステートメントを含めましたか?それがここでの通常の問題です。。あなたは確かにあなたの意見は、プロジェクトに(右クリックして、選択したアンロードを編集する右クリックしてファイルをコンパイルしたいこと- 。trueにセットMvcBuildViewsを保存して閉じ、右クリックしてリロードプロジェクトと再コンパイルします。
アダムTuliper - MSFT

1
拡張機能と呼ばれるフォルダを作成します。そこにhtmlextensions.csクラスを追加し(名前空間が正しいことを確認してください)、ビューで次を使用します。@ using Yourapp.Extensionsは、問題が発生した場合にメモ帳を使用してMvcBuildViewsも有効にします。
Adam Tuliper-MSFT 2011年

1
Ekkis、プロジェクトに何をしたかわからないが、HtmlHelperExtensionを作成するには、次のことを行う必要があります。1)静的クラスを作成します(私はHtmlHelperExtensionsと呼びます)2)そのクラス内で、<Extension( )>、適切な署名付き。3)MvcHtmlString.Create()を返します。便利で機能的な例については、この投稿を参照してください:stackoverflow.com/questions/4896439/action-image-mvc3-razor
ベンフィンケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.