J'utilise un modèle qui contient une liste en tant que propriété. Je remplis cette liste avec des éléments que je récupère sur SQL Server. Je veux que la liste soit masquée dans la vue et transmise à l'action POST. Plus tard, je souhaiterai peut-être ajouter plus d'éléments à cette liste avec jQuery, ce qui rend un tableau impropre à une expansion ultérieure. Normalement, vous utiliseriez
@Html.HiddenFor(model => model.MyList)
pour accomplir cette fonctionnalité, mais pour une raison quelconque, la liste dans POST est toujours nulle.
Question très simple, quelqu'un sait pourquoi MVC se comporte comme ça?
c#
asp.net
asp.net-mvc-3
hidden-field
Anton Smith
la source
la source
<input />
s?MyList
contientHiddenFor
n'est utilisé que pour une entrée à la fois.Model.MyList
? Vous devrez peut-être effectuer manuellement une sérialisation / désérialisation de votre liste.Réponses:
Je viens de rencontrer ce problème et je l'ai résolu simplement en procédant comme suit:
En utilisant un for au lieu d'un foreach, la liaison de modèle fonctionnera correctement et récupérera toutes vos valeurs masquées dans la liste. Cela semble être le moyen le plus simple de résoudre ce problème.
la source
@Html.HiddenFor(model => Model.ToGroups[i].RowId)
@Html.EditorFor(model => Model.ToGroups[i].Id)
suivi de@Html.EditorFor(model => Model.ToGroups[i].Description)
la prochaine fois - à la fois dans la boucle for. Et le contrôleur a pu le mapper à une liste des modèles avec ces champs. Et pour vous assurer que rien de tout cela n'apparaît à l'écran, entourez-le simplement de<div style="display: none;"></div>
for
boucle en ceci:for(int i = 0; i < Model.Departments.Count(); i++)
HiddenFor n'est pas comme un DisplayFor ou un EditorFor. Cela ne fonctionnera pas avec des collections, seulement des valeurs uniques.
Vous pouvez utiliser l'assistant Serialize HTML disponible dans le projet MVC Futures pour sérialiser un objet dans un champ masqué, ou vous devrez écrire le code vous-même. Une meilleure solution consiste simplement à sérialiser un identifiant quelconque et à récupérer les données de la base de données lors de la publication.
la source
Il est un peu un hack, mais si
@Html.EditorFor
ou le@Html.DisplayFor
travail de votre liste, si vous voulez vous assurer qu'il est envoyé à la demande de poste , mais pas visible, vous pouvez simplement le style à l' aidedisplay: none;
de le cacher au lieu, par exemple:la source
Qu'en est-il de l'utilisation de Newtonsoft pour désérialiser l'objet dans une chaîne json, puis l'insérer dans votre champ caché, par exemple ( Model.DataResponse.Entity.Commission est une liste d' objets "CommissionRange" simples comme vous le verrez dans le JSON)
Rend comme:
Dans mon cas, je fais des trucs JS pour éditer le json dans le champ caché avant de le renvoyer
Dans mon contrôleur, j'utilise à nouveau Newtonsoft pour désérialiser:
la source
Html.HiddenFor
est conçu pour une seule valeur. Vous devrez sérialiser votre liste d'une manière ou d'une autre avant de créer le champ masqué.Par exemple, si votre liste est de type chaîne, vous pouvez joindre la liste dans une liste séparée par des virgules, puis diviser la liste après la publication dans votre contrôleur.
la source
Je viens de découvrir (après quelques heures à essayer de comprendre pourquoi les valeurs du modèle ne retournaient pas au contrôleur) que masqué pour devrait suivre EditorFor.
À moins que je ne fasse autre chose de mal, c'est ce que j'ai trouvé. Je ne referai plus l'erreur.
Dans le contexte d'un modèle qui contient une liste d'une autre classe.
Cela ne fonctionnera PAS:
Où comme ça va ......
la source
J'ai commencé à fouiller dans le code source de
HiddenFor
, et je pense que l'obstacle que vous voyez est que votre objet complexeMyList
n'est pas implicitement convertible en typestring
, donc le cadre traite votreModel
valeur commenull
et rend l'value
attribut vide.la source
Vous pouvez jeter un oeil sur cette solution .
Mettez uniquement HiddenFor dans EditorTemplate.
Et dans votre vue, mettez ceci:
@Html.EditorFor(model => model.MyList)
Cela devrait fonctionner.
la source
Face au même problème. Sans boucle for, il n'a posté que le premier élément de la liste. Après avoir parcouru la boucle for, il peut conserver la liste complète et publier avec succès.
la source
Une autre option serait:
la source
La
foreach
boucle au lieu d'unefor
boucle pourrait être une solution légèrement plus propre.la source
Une autre façon possible de résoudre ce problème serait de donner à chaque objet de votre liste un ID, puis d'utiliser
@Html.DropDownListFor(model => model.IDs)
et de remplir un tableau contenant les ID.la source
peut-être en retard, mais j'ai créé une méthode d'extension pour les champs cachés de la collection (avec des éléments de type de données simples):
Alors voilà:
L'utilisation est aussi simple que:
la source