Es gibt kein @ Html.Button!

80

das ist komisch. Ich sehe Referenzen für @ Html.Button (), aber wenn ich tippe, dass Intellisense keinen solchen Helfer findet ... gibt es Dropdown-Listen, versteckte, Editoren usw., aber keine Schaltfläche!

was ist damit?

ekkis
quelle
Wo sehen Sie solche Referenzen?
SLaks
1
Ich verstehe den Wunsch nach Konsistenz, aber es besteht wirklich keine Notwendigkeit für eine (nichts, vor dem verschlüsselt oder geschützt werden muss). Alles, was es wäre, wäre ein langer Weg, um ein einzelnes HTML-Tag zu schreiben: '@ Html.Button ("myButton", neu {@class = "myClass"}) 'vs' <button class = "myClass"> myButton </ button> '
Nine Tails
4
@Russel - Ich würde dem nicht zustimmen - Ich habe Erweiterungsmethoden für MvcHtmlString erstellt, um DOM-Elemente zu deaktivieren, schreibgeschützt zu machen und auszublenden. Da es keinen HTML-Helfer für Schaltflächen gibt, kann ich meine Erweiterungsmethoden nicht verwenden. Zu sagen, dass es keine Notwendigkeit gibt, ist ein bisschen kurzsichtig und möglicherweise naiv.
Barrypicker

Antworten:

68
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());
  }
}
Jessegavin
quelle
1
Ja ... sie müssen einen wirklich guten Grund gehabt haben, sonst wäre es ein großer Fehler.
Andrei Rînea
Vielen Dank, ich war auf einem neuen Projekt und überrascht, keine html.button zu sehen
Tom Stickel
7
Wenn Sie das @Html.Button("ButtonText", new {Name = "name", Value = "value" })Format verwenden möchten , fügen Sie diese Klasse hinzu:public static MvcHtmlString Button(this HtmlHelper helper, string text, object htmlAttributes) { return Button(helper, text, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); }
Mason240
1
Guter Anruf @ Mason240. Ich habe meine Antwort mit einer Überladung aktualisiert, wie Sie vorgeschlagen haben.
Jessegavin
whoa ... wie habe ich noch nie gesehen HtmlHelper.AnonymousObjectToHtmlAttributes?
Drzaus
9

Ab MVC Preview 3 gibt es keinen Button Helper (nicht MVC3).

Es wurde in der Vergangenheit ein Haufen erwähnt, zum Beispiel: http://blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/ Wie auch immer das Rollen Ihrer eigenen ist trivial - ich habe eine Basis dafür muss ich es irgendwo hier ausgraben, aber im Wesentlichen nur ein neues Html.ButtonFor erstellen und den Quellcode von Html.LabelFor kopieren und die Ausgabe ändern, um ein Tag vom Typ input type = "button" zu erstellen.

Adam Tuliper - MSFT
quelle
9

So erweitern Sie die akzeptierte Antwort , dass Sie eine Senden-Schaltfläche an eine Modelleigenschaft binden können, aber einen anderen Text haben:

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

Verwenden der folgenden leicht modifizierten ButtonHilfsklasse :

/// <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);
    }
}
drzaus
quelle
8

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

Dadurch wird ein Link generiert, der wie eine Schaltfläche aussieht.

Piotr Knut
quelle
2
Was ist "Bootstrap 3"?
Ekkis
1
Es tut mir leid, ich habe das falsche Wort eingegeben. Natürlich meine ich den Bootstrap. Danke ekkis. Link
Piotr Knut
1
Dadurch wird keine Schaltfläche erstellt, sondern ein Link, der wie eine Schaltfläche aussieht.
SMUsamaShah
2
Für mich kann dies nicht kompiliert werden, wenn sich die öffnende Klammer nicht in derselben Zeile wie ActionLink befindet.
GaTechThomas
GaTechThomas. Ja, es ist wahr. Alles sollte in einer Zeile stehen. Ich habe es auf diese Weise neu formatiert, die leichter zu lesen war. Es ist am besten, eine eigene Schaltfläche (oder etwas anderes) zu erstellen. Wenn Sie jedoch keine Zeit dafür haben oder sich keine Sorgen über das Erscheinungsbild machen, ist dies eine schnelle Lösung.
Piotr Knut
1

Razor scheint keinen HTML-Helfer "Button" zu haben. Sie finden wahrscheinlich Verweise auf eine benutzerdefinierte HTML-Hilfserweiterung.

Siehe hier: http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

Ben Finkel
quelle
1
scheint das nicht bizarr? vor allem, wenn es trivial ist, warum nicht der Vollständigkeit halber einschließen?
Ekkis
Ich habe dieses Dokument gelesen, aber ich kann es nicht zum Laufen bringen. Ich habe meinen Helfer in einer Datei namens HtmlHelpers.cs im Stammverzeichnis des Projekts abgelegt, die eine statische Klasse HtmlHelpers mit einer öffentlichen statischen Methode enthält, die eine Zeichenfolge zurückgibt, deren einziger Parameter "this HtmlHelper helper" ist. Alles wird kompiliert und der .Button sollte in Intellisense erscheinen, aber nicht ... was soll ich sonst noch tun?
Ekkis
1
Haben Sie die Importanweisung für Ihren Erweiterungsnamespace oben in Ihrer Ansicht eingefügt? das ist hier das übliche Problem. Möglicherweise möchten Sie sicherstellen, dass Ihre Ansichten kompiliert werden (klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Entladen. Klicken Sie mit der rechten Maustaste, um die Datei zu bearbeiten. Setzen Sie MvcBuildViews auf true. Speichern und schließen Sie und klicken Sie mit der rechten
Maustaste
1
Erstellen Sie einen Ordner namens Erweiterungen. Fügen Sie dort die Klasse htmlextensions.cs hinzu (stellen Sie sicher, dass der Namespace korrekt ist) und verwenden Sie dann in Ihrer Ansicht: @using Yourapp.Extensions aktivieren Sie auch die MvcBuildViews mithilfe des Editor, wenn Sie ein Problem haben.
Adam Tuliper - MSFT
1
Ekkis, Sie sind sich nicht sicher, was Sie mit Ihrem Projekt gemacht haben, aber Sie müssen Folgendes tun, um eine HtmlHelperExtension zu erstellen: 1) Erstellen Sie eine statische Klasse (ich nenne meine HtmlHelperExtensions) 2) Erstellen Sie innerhalb dieser Klasse öffentliche Methoden, die als <Extension ( )> mit der richtigen Unterschrift. 3) Geben Sie MvcHtmlString.Create () zurück. In diesem Beitrag finden Sie ein nützliches und funktionales Beispiel: stackoverflow.com/questions/4896439/action-image-mvc3-razor
Ben Finkel