83 votes

Html.EditorFor Définir la valeur par défaut

Question de débutant. J'ai un paramètre qui est passé à une vue de création. J'ai besoin de définir un nom de champ avec une valeur par défaut. @Html.EditorFor(model => model.Id) J'ai besoin de définir ce champ de saisie avec le nom Id avec une valeur par défaut qui est transmise à la vue via un lien d'action.

Ainsi, comment ce champ de saisie --@Html.EditorFor(model => model.Id) -- peut-il être défini avec une valeur par défaut.

Les éléments suivants fonctionneraient-ils ? Où le nombre 5 est un paramètre que je passe dans le champ de texte pour définir la valeur par défaut.

@Html.EditorFor(c => c.PropertyName, new { text = "5"; })

110voto

Khepri Points 5790

Voici ce que j'ai trouvé :

@Html.TextBoxFor(c => c.Propertyname, new { @Value = "5" })

fonctionne avec un V majuscule, et non un v minuscule (l'hypothèse étant que value est un mot clé utilisé dans les setters typiquement) Valeur inférieure et supérieure

@Html.EditorFor(c => c.Propertyname, new { @Value = "5" })

ne fonctionne pas

Votre code finit par ressembler à ceci

<input Value="5" id="Propertyname" name="Propertyname" type="text" value="" />

Valeur contre valeur. Je ne suis pas sûr d'aimer ça.

Pourquoi ne pas simplement vérifier dans l'action du contrôleur si la propriété a une valeur ou non et, si ce n'est pas le cas, la définir dans votre modèle de vue avec la valeur par défaut et la laisser se lier afin d'éviter tout ce travail de singe dans la vue ?

4 votes

JAMAIS définir l'attribut de valeur lors de l'utilisation de HtmlHelper méthodes. Vous définissez la valeur de la propriété dans la méthode GET avant de transmettre le modèle à la vue.

0 votes

Et pourquoi ça ?

69voto

Shadi Points 786

La façon la plus propre de le faire est de passer une nouvelle instance de l'entité créée par le contrôleur :

//GET
public ActionResult CreateNewMyEntity(string default_value)
{
    MyEntity newMyEntity = new MyEntity();
    newMyEntity._propertyValue = default_value;

    return View(newMyEntity);
}

Si vous voulez passer la valeur par défaut par ActionLink

@Html.ActionLink("Create New", "CreateNewMyEntity", new { default_value = "5" })

0 votes

C'est la solution que j'ai fini par utiliser. Anton Semenov a raison : l'idéologie du MVC exige que le développeur définisse les valeurs par défaut dans le contrôleur et non dans la vue.

18voto

Anton Semenov Points 3375

Il n'est pas correct de définir une valeur par défaut dans la vue. La vue doit effectuer un travail d'affichage, pas plus. Cette action brise l'idéologie du modèle MVC. Le bon endroit pour définir les valeurs par défaut est la méthode create de la classe controller.

0 votes

Je veux changer le format d'une valeur de date (dd/MM/yyyy mm:HH:ss) en (yyyy/MM/dd).

16voto

La meilleure option est de le faire dans votre modèle de vue comme suit

public class MyVM
{
   int _propertyValue = 5;//set Default Value here
   public int PropertyName{
       get
       {
          return _propertyValue;   
       }
       set
       {
           _propertyValue = value;
       }
   }
}

Alors, selon vous

@Html.EditorFor(c => c.PropertyName)

fonctionnera comme vous le souhaitez (si aucune valeur, la valeur par défaut sera là).

0 votes

Pourquoi coder en dur une valeur de propriété dans la VM ? Cela n'a aucun sens pour moi, mais peut-être que j'essaie de faire quelque chose de différent ? J'essaie de transmettre le paramètre de la chaîne de requête, id, à la vue Create et de remplir l'aide EditorFor avec cette valeur id, afin qu'elle enregistre l'id du FK dans la base de données. Comment dois-je m'y prendre ?

4voto

Smithy Points 544

Je viens de faire cela (première réponse de Shadi) et cela fonctionne à merveille :

    public ActionResult Create()
    {
        Article article = new Article();
        article.Active = true;
        article.DatePublished = DateTime.Now;
        ViewData.Model = article;
        return View();
    } 

Je pourrais mettre les valeurs par défaut dans mon modèle comme un propper MVC addict : (J'utilise Entity Framework)

    public partial class Article
    {
        public Article()
        {
            Active = true;
            DatePublished = Datetime.Now;
        }
    }

    public ActionResult Create()
    {
        Article article = new Article();
        ViewData.Model = article;
        return View();
    } 

Quelqu'un voit-il des inconvénients à cela ?

1 votes

Ce sont des valeurs fixes par défaut, si vous voulez les fournir pendant l'exécution, vous devez adopter une approche différente.

1 votes

Merci @Shadi, techniquement Datetime.Now n'est pas une valeur fixe. Si la valeur par défaut était généré au moment de l'exécution, serait-ce la responsabilité des modèles ou du contrôleur ?

3 votes

Si l'on se réfère aux règles MVC (vous pouvez les enfreindre !), le modèle ne sert qu'à contenir les données, la vue à les afficher, et votre activité doit être placée dans le contrôleur ou dans les classes auxquelles le contrôleur a accès. Réponse courte, c'est la responsabilité du contrôleur.

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