50 votes

Méthodes d'aide HTML ASP.NET MVC pour les nouveaux types d'entrée HTML5

HTML5 semble prendre en charge une nouvelle gamme de champs de saisie para des choses telles que :

  • Chiffres
  • Adresses électroniques
  • Couleurs
  • URL
  • Plage numérique (via un curseur)
  • Dates
  • Boîtes de recherche

Quelqu'un a-t-il mis en œuvre HtmlHelper pour ASP.NET MVC qui génère ces méthodes ? Il est possible de le faire en utilisant une surcharge qui accepte htmlAttributes , tels que

Html.TextBoxFor(model => model.Foo, new { type="number", min="0", max="100" })

Mais ce n'est pas aussi agréable (ni aussi sûr) que :

Html.NumericInputFor(model => model.Foo, min:0, max:100)

53voto

Paul Hiles Points 3887

Je vous signale que nombre d'entre elles sont désormais incorporées dans MVC4 en utilisant l'option DataType attribut.

A partir de ce point de travail que vous pouvez utiliser :

public class MyModel 
{
    // Becomes <input type="number" ... >
    public int ID { get; set; }

    // Becomes <input type="url" ... >
    [DataType(DataType.Url)]
    public string WebSite { get; set; }

    // Becomes <input type="email" ... >
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    // Becomes <input type="tel" ... >
    [DataType(DataType.PhoneNumber)]
    public string PhoneNumber { get; set; }

    // Becomes <input type="datetime" ... >
    [DataType(DataType.DateTime)]
    public DateTime DateTime { get; set; }

    // Becomes <input type="date" ... >
    [DataType(DataType.Date)]
    public DateTime Date { get; set; }

    // Becomes <input type="time" ... >
    [DataType(DataType.Time)]
    public DateTime Time { get; set; }
}

0 votes

@Drew - je pense que date, datetime et time sont inclus dans ce work item (ils font certainement partie de la version mvc4). pourquoi dites-vous le contraire ?

0 votes

J'ai mal interprété le commentaire : Nous devons le faire automatiquement pour tel, url, email, datetime, date, time et number. J'ai mis un lien vers la documentation et j'ai étendu le code d'exemple. Bonne trouvaille, merci.

23voto

Mauricio Scheffer Points 70470

0 votes

MVC ne supporte-t-il pas HTML5 par défaut ?

12voto

user1191559 Points 101

Le plus simple est d'ajouter simplement type="Email" comme attribut html. Il remplace le type="text" par défaut. Voici un exemple avec un validateur html5 requis :

@Html.TextBox("txtEmail", "", new {placeholder = "email...", @type="email", @required = ""})

0 votes

C'est à peu près ce que je montre dans la question initiale. Je cherchais une solution plus sûre.

0 votes

Bonjour @Drew - vous avez tout à fait raison, le temps que je lise les réponses, j'avais oublié votre question initiale - désolé !

0 votes

Pas d'inquiétude à avoir. Votre code fonctionne sans aucun doute, mais j'aimerais éviter d'utiliser des types anonymes, à la fois pour des raisons de performance et parce que le compilateur ne vérifie pas qu'ils sont corrects.

11voto

RPAlbert Points 41

Ce que je n'aime pas Types de données Les attributs sont ceux que vous devez utiliser Rédacteur en chef dans la vue. Dans ce cas, vous ne pouvez pas utiliser htmlAttributes pour décorer votre étiquette. Il existe d'autres solutions mais je préfère cette méthode.

Dans cet exemple, je n'ai étendu que la signature que j'utilise le plus souvent.

Donc dans la classe :

using System.Linq.Expressions;
namespace System.Web.Mvc.Html
{
    public static class HtmlExtensions
    {
        public static MvcHtmlString EmailFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, Object htmlAttributes)
        {
            MvcHtmlString emailfor = html.TextBoxFor(expression, htmlAttributes);
            return new MvcHtmlString(emailfor.ToHtmlString().Replace("type=\"text\"", "type=\"email\""));
        }
    }
}

Comme vous le voyez, j'ai juste changé le type="text" pour le type="email" et je peux ensuite l'utiliser dans ma vue :

    <div class="form-group">            
        @Html.LabelFor(m => m.Email, new { @class = "col-lg-2 control-label" })
        <div class="col-lg-10">
            @Html.EmailFor(m => m.Email, new { @class = "form-control", placeholder = "Email" })
            @Html.ValidationMessageFor(m => m.Email)                                 
        </div>            
    </div>

Et la source html donne :

<div class="form-group">            
    <label class="col-lg-2 control-label" for="Email">Email</label>
    <div class="col-lg-10">
        <input class="form-control" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" placeholder="Email" type="email" value="" />
        <span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>                                 
    </div>            
</div>

2 votes

Pour votre information, vous pouvez en fait utiliser les attributs html avec EditorFor, mais vous devrez écrire votre propre modèle pour cela. Ce qui est beaucoup moins intrusif que d'écrire une nouvelle aide Html.

0 votes

Je suis d'accord avec vous et j'ai vu quelques remarques sur l'utilisation des templates. Malheureusement, je n'en suis qu'au stade de l'apprentissage de MVC pour l'instant et je n'ai pas pris le temps de regarder les templates Editor et Display.

4 votes

Depuis MVC 5.1, vous pouvez utiliser des attributs HTML avec les balises EditorFor.

9voto

Phillip Wells Points 61

J'adore quand on peut conduire ce genre de choses hors du modèle ! J'ai décoré mes modèles avec [DataType(DataType.PhoneNumber)] et tous sauf un ont fonctionné.

J'ai réalisé à mes dépens que @Html.TextBoxFor ne rend pas le type="<HTML5 type>" mais @Html.EditorFor fait. C'est logique maintenant que j'y pense, mais je poste ceci pour éviter à d'autres de perdre les quelques minutes frustrantes que je viens de perdre ;)

0 votes

Dans mon cas, cela ne fonctionne pas avec TextBoxFor et EditorFor dans IE et Chrome.

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