esto es raro. Veo referencias que hay para @Html.Botón (), pero cuando me escriba que Intellisense no encontrar un ayudante… hay dropdownlist, oculto, editores, etcétera, pero no hay ningún botón!

qué pasa con eso?

  • Donde ves esas referencias?
  • google vas a encontrar un montón
  • Entiendo el deseo de coherencia, pero no hay realmente ninguna necesidad de uno (nada para codificar o proteger contra) así que todo sería es una larga mano de la manera de escribir una sola etiqueta html: ‘@Html.Botón(«myButton», new { @class = «miclase»})’ vs ‘<botón class=»miclase»>myButton</botón>’
  • Yo estaría de acuerdo – me han creado métodos de extensión en MvcHtmlString deshabilitar, hacer readonly, y ocultar elementos del DOM. Porque no hay ninguna ayuda HTML para botones no puedo usar mi los métodos de extensión. A decir ‘no es necesario’ es un poco corto de miras y, posiblemente, ingenuo.
InformationsquelleAutor ekkis | 2011-05-10

5 Comentarios

  1. 67
    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());
      }
    }
    • gracias por el código. sólo que es difícil creer que no hay uno que ya existe…
    • Sí… debe haber tenido alguna razón realmente buena de lo contrario sería un gran error.
    • Gracias, yo estaba en un nuevo proyecto y se sorprendió de no ver el html.botón
    • Si desea utilizar el @Html.Button("ButtonText", new {Name = "name", Value = "value" }) formato, agregar esta clase: public static MvcHtmlString Button(this HtmlHelper helper, string text, object htmlAttributes) { return Button(helper, text, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); }
    • Bueno llame a @Mason240. He actualizado mi respuesta con una sobrecarga como usted sugiere.
    • whoa…¿cómo he visto nunca HtmlHelper.AnonymousObjectToHtmlAttributes antes?
    • Me sale el siguiente error cuando se utiliza el código anterior: 'HtmlHelper<dynamic>' does not contain a definition for 'Button' and no extension method 'Button' accepting a first argument of type 'HtmlHelper<dynamic>' could be found (are you missing a using directive or an assembly reference?) puse la extensión en la namespace System.Web.Mvc.Html

  2. 8

    No hay ningún botón ayudante de mvc vista previa de 3 (no mvc3)

    fue mencionado un montón en el pasado como, por ejemplo:
    http://blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/
    sin embargo rodar su propio es trivial – tengo una base en algún lugar cerca de aquí, voy a tener que buscarla, pero, básicamente, crear un nuevo Html.ButtonFor y copiar el código fuente de Html.LabelFor y cambiar la salida para crear un input type=»button» de la etiqueta.

  3. 7

    Para ampliar la aceptado respuesta, así que usted puede enlazar un botón de enviar a un modelo de propiedad pero con diferente texto:

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

    Utilizando la siguiente ligeramente modificado Botón ayudante de clase:

    ///<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);
    }
    }
  4. 6

    MVC5 , Bootstrap versión 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" }
    )

    Que esto va a generar un vínculo que se parece a un botón.

    • lo del «Bootstrap 3»?
    • Lo siento, he escrito la palabra equivocada. Por supuesto, me refiero a la secuencia de arranque. Gracias ekkis. enlace
    • Esto no crea un botón, en lugar de un enlace que se parece a un botón.
    • Para mí esta falla al compilar si el paréntesis de apertura no está en la misma línea que ActionLink.
    • GaTechThomas. Sí, es verdad. Todo debe estar en una línea. Yo formatear de esta manera que fuera fácil de leer. Es mejor crear su propio botón (o algo más), pero si usted no tiene el tiempo para hacerlo o no están preocupados acerca de su apariencia, que es una solución rápida.
  5. 1

    De afeitar no parecen tener un «Botón» HTML helper. Usted es probable encontrar referencias a una hecha a la medida HTML helper extension.

    Ver aquí: http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

    • ¿no le parece extraño? sobre todo si es trivial, ¿por qué no incluirlo para la integridad??
    • He leído que el doc pero no puedo hacer que funcione. He puesto mi ayudante en un archivo llamado HtmlHelpers.cs en la raíz del proyecto y contiene una clase estática HtmlHelpers con un método estático público que devuelve una cadena cuyo único parámetro es «este HtmlHelper ayudante». todo se compila y el .El botón debe aparecer en Intellisense pero no… ¿qué más se supone que debo hacer?
    • ¿incluye la declaración de importación para la extensión de espacio de nombres en la parte de arriba de su punto de vista? esa es la costumbre aquí. puede que desee asegurarse de que sus puntos de vista compilar (clic derecho sobre el proyecto, seleccione descargar. haga clic para modificar el archivo de conjunto de MvcBuildViews a la verdad. guardar y cerrar y haga clic derecho y volver a cargar el proyecto y compilar de nuevo.
    • He movido el archivo en los puntos de vista/carpeta Compartida y la rebautizó con el nombre de los Ayudantes de la clase también) pero no dice… estoy usando el «espacio de nombres sitio Web», que es mi aplicación de espacio de nombres y (creo), por lo que debe ser incluido en todas las vistas, pero todavía no puedo conseguir que funcione. grr… ¿qué podría ser?
    • He intentado descargar el proyecto… por desgracia, tengo un poco de Visual Studio «explorador» de la extensión que explotó «La operación no se pudo completar. No se aplican.» y yo tenía que matar a VS. Yo no estoy usando un espacio de nombres diferente… qué tengo que hacer eso?
    • ahora estoy en mal estado. Yo no puedo volver a cargar el proyecto, cuando lo intento se queja de «Un proyecto con ese nombre ya está abierto en la solución.» los pensamientos?
    • He desactivado la Productividad de las Herramientas de Poder y se reinicia VS, pero todavía no pude llegar a cargar el proyecto. He encontrado una MANERA de artículo que propuso suprimir la .suo archivo que se fija (ooph).
    • crear una carpeta llamada extensiones. agregar el htmlextensions.cs clase (asegurándose de que el espacio de nombres es correcta) y, a continuación, en la vista uso: @usando Yourapp.Las extensiones permiten también la MvcBuildViews con el bloc de notas si usted está teniendo un problema.
    • MvcBuildViews es genial. aunque una vez voy a tratar de compilar el proyecto en el que tengo el error: «no se Pudo cargar el tipo ‘System.De datos.Entidad.Diseño.AspNet.EntityDesignerBuildProvider'» de mi web.config. He encontrado un [stackoverflow.com/questions/2762256/… artículo) que indica que necesitaba para incluir una referencia a un ensamblado <add assembly="System.Data.Entity.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />, sin embargo, que sólo lleva a otro error…
    • …»Es un error utilizar una sección registrada como allowDefinition=’MachineToApplication’ más allá del nivel de aplicación», que todavía tengo que averiguar. hay sugerencias, hay que tener dos Web.Los archivos de configuración (tal vez tener uno en una subcarpeta) será causa de esto, pero ese no es mi problema. hay también hablar de tener que configurar la aplicación para IIS, aunque estoy implementación en IIS Express sin problemas así que no estoy seguro de que ese es el problema…
    • Ekkis, No está seguro de lo que has hecho a tu proyecto, pero lo que usted necesita hacer lo siguiente para crear un HtmlHelperExtension: 1) Crear una clase estática (que yo llamo mina HtmlHelperExtensions) 2) Dentro de esa clase de métodos públicos, anotado como <Extensión()>, con la firma correspondiente. 3) Volver MvcHtmlString.Create(). Ver este post para una útil y funcional ejemplo: stackoverflow.com/questions/4896439/action-image-mvc3-razor
    • ok, lo tengo todo al trabajo. He encontrado que bajo el obj\ directorio había varias copias de la Web.Config así que me dejó todo el directorio y volver a compilar (tuve que agregar la referencia de ensamblado se indicó anteriormente). Todo funcionó de maravilla!
    • En resumen, no importa el espacio de nombres de los de su clase que contiene su HtmlHelper métodos está en. Lo que importa es que la vista tiene acceso a ese espacio de nombres. I (injustamente) supone vistas a tener acceso a mi solicitud de espacio de nombres. Me decidí al final de uso del sitio Web.HtmlHelpers, pero podría haber utilizado fácilmente solo sitio Web. Gracias a todos por la ayuda!
    • Finkel, excelente artículo. ahora que he conseguido que el mecanismo funcione tengo una plantilla para la construcción de estas cosas. muchas gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here