81 votes

Il n'y a pas de @ Html.Button!

c'est bizarre. Je vois des références là-bas pour @ Html.Button () mais quand je tape, Intellisense ne trouve pas un tel assistant ... il y a une liste déroulante, des masques, des éditeurs, et cetera, mais pas de bouton!

Qu'est-ce qui se passe avec ça?

69voto

jessegavin Points 20854
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());
  }
}

43voto

ssg Points 20321

Bien que cela a déjà répondu, je vois qu'il y a toujours cette idée fausse commune au sujet de la façon dont ASP.NET MVC est conçu et pourquoi il n'y a pas d' Html.Button. Apparemment, la plupart pensent qu'il a été omis ou oublié à ajouter. Ce n'est pas le cas.

ASP.NET MVC est aussi mince que possible. Il fournit seulement à la fonctionnalité requise. Vous n'avez pas besoin de sortir de la zone de Html.Button parce qu'il n'a pas besoin de travailler avec le modèle ou le routage. D'autres aides sont toutefois prévues à pont HTML et MVC structures de données. Html.Button n'a aucun sens dans ce contexte. Il serait juste un simple wrapper. Dans ce cas, une nouvelle abstraction ne serait qu'une surcharge. L'utilisation de code HTML à la place. Si vous avez beaucoup de points communs entre vos boutons, utiliser les CSS ou JavaScript à mettre en place. MVC essaie de rester en dehors de votre chemin, autant que possible, et de vous laisser avec des matures existants et des technologies universelles.

L'apprentissage MVC est beaucoup plus facile que d'ordinaire ASP.NET WebForms parce que le montant des éléments de conception, de l'objet et de la méthode des noms dont vous avez besoin pour apprendre, c'est très petit. Je pense que c'est la bonne approche et de ce fait MVC se démarquer.

9voto

Adam Tuliper - MSFT Points 22478

Il n'y a pas de bouton aide de la mvc extrait 3 (pas mvc3)

il a été mentionné à plusieurs dans le passé, par exemple: http://blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/ cependant roulement de votre propre est trivial - j'ai une base quelque part autour d'ici, je vais avoir à creuser, mais essentiellement, il suffit de créer un nouveau Html.ButtonFor et de copier le code source Html.LabelFor et changer la sortie de créer un input type="button" tag.

9voto

drzaus Points 3344

Pour développer la réponse acceptée , vous pouvez ainsi lier un bouton d'envoi à une propriété de modèle, mais avec un texte différent:

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

Utilisation de la classe d’assistance Button légèrement modifiée suivante:

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

1voto

Ben Finkel Points 1646

Razor ne semble pas avoir d'aide HTML "Button". Vous trouverez probablement des références à une extension d'assistance HTML construite sur mesure.

Voir ici: http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X