MVC4 Complexe Type de Modèle est nulle après le post
C'est mon modèle
public class AdministrationModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public bool IsApproved { get; set; }
}
C'est mon contrôleur
public ActionResult GetTabContent(string id)
{
switch (id)
{
case "tab3":
model = GetAllUsersInfo();
viewName = "Administration";
break;
}
return View(viewName);
}
private List<AdministrationModel> GetAllUsersInfo()
{
List<AdministrationModel> userList = new List<AdministrationModel>();
foreach (MembershipUser user in Membership.GetAllUsers())
{
UserProfile userProfile = UserProfile.GetUserProfile(user.UserName);
userList.Add(new AdministrationModel { EmailAddress = user.Email, IsApproved = user.IsApproved, FirstName = userProfile.FirstName, LastName = userProfile.LastName });
}
return userList;
}
C'est mon point de Vue
@model List<AdminContainerModel>
@using (Html.BeginForm("Administration", "Account"))
{
<fieldset>
<div>
@foreach (AdministrationModel AM in Model)
{
<div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.FirstName)</div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.LastName)</div>
<div class="colFull">@Html.DisplayFor(modelItem => AM.EmailAddress)</div>
<div class="colPartial"><input type="checkbox" checked="@AM.IsApproved"/> </div>
<div class="clear"></div>
</div>
}
</div>
<input type="submit" value="Update Account" />
</fieldset>
}
Lorsque l'utilisateur clique sur le bouton mettre à Jour le Compte, il va vers le contrôleur
[HttpPost]
public ActionResult Administration(List<AdministrationModel> model)
{
return View();
}
à l'intérieur de cette méthode, le modèle est toujours null. cependant la Vue qui rend tout est parfait et montre ce que je veux montrer. Ce que je fais mal?
OriginalL'auteur Vijay V | 2012-04-18
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation des collections, afin de traiter correctement de sorte qu'ils sont modèle lié sur le post sans jambe de travail, vous devez vous assurer qu'ils sont indexés correctement, vous pouvez le faire en utilisant une boucle for, quelque chose comme:
Qui devraient modèle de lier sans aucun autre code 🙂
Edit: Désolé j'ai oublié, displayFors par défaut ne mettez pas les bonnes propriétés pour la liaison de modèle, a ajouté hiddenFors pour les autres champs qui n'ont pas une editorFor
Edit2: Basé sur votre autre question dans le commentaire, si c'était face au public, et vous ne voulez pas de changer tout le caché pour les valeurs à l'aide des outils de dev, essayez les solutions suivantes:
Ok, donc vous ne voulez pas à changer la hiddenFors, c'est très bien, mais vous aurez besoin d'une sorte de code de sorte que vous savez quel est le client qui, lorsque les données sont affichées, je suggère qu'au lieu d'avoir ces dans le code ci-dessus:
Remplacer par:
De cette façon, vous n'êtes pas publier les prénom, nom ou adresse e-mail, juste une référence pour le client réel qui est coché, décoché.
Pour répondre à votre autre question dans le commentaire sur le fait de garder une trace de l'origine des valeurs, dans votre méthode de contrôleur, vous pouvez simplement aller et obtenir les valeurs d'origine de la base de données, alors voici comment vous pouvez détecter celles qui sont de différent, quelque chose comme:
Désolé vérifier mon montage, j'ai oublié displayFors ne pas mettre le Nom des propriétés sur les champs correctement le modèle de liaison (nous avons changé notre modèle pour le faire). Dans le contrôleur, vous pourriez juste le filtre non vérifié, en lien donc quelque chose comme var clients = modèle.Où c => c.IsApproved).ToList()
il a travaillé génial, cependant j'ai 2 questions au sujet de ceci: 1. si quelqu'un modifie le champ caché (outils de dev dans presque tous les navigateur) puis la valeur dans le modèle trop de changements 2. le lamda expression ne donne que la liste de tous les bagages, comment puis-je garder la trace de ceux qui ont déjà été vérifiés et qui ont été vérifiés au cours de cette session
Cool. 1. Est-il un site web que vous ne souhaitez pas autoriser les gens à manipuler? 2. Vous pouvez simplement faire de votre modèle de type complexe contenant deux listes de clients, que vous éditez et de celui d'origine. Répéter l'opération pour la boucle des deux collections, mais juste avoir tous les champs cachés pour la collection d'origine.
Voulais juste vous dire merci! remplacement foreach avec de la liaison fixe.
OriginalL'auteur mattytommo
Votre
@model
directive est incorrecte, il doit être pleinement qualifié du nom de type.Dans ce cas:
Après la mise à jour de votre question.
Essayez d'utiliser:
Cela appel spécialisé Éditeur de Modèle pour votre liste.
http://blogs.msdn.com/b/nunos/archive/2010/02/08/quick-tips-about-asp-net-mvc-editor-templates.aspx
avez-vous voulez me remplacer méthode displayfor avec EditorFor? J'ai essayé et mon modèle est toujours null après le post. Je suis sûr que je suis absent quelque chose (tout simplement pas sûr de ce que c'est)
Vous avez besoin d'un EditorTemplate Vue que les cartes de la
AdministrationModel
.Html.EditorFor(Model)
va chercher ce point de vue. Il n'est pas nécessaire pour parcourir la liste une fois que vous utilisez ce.Ok, j'ai eu à travailler de cette façon. Toutefois, cela rend tout dans le modèle comme un champ modifiable. Tout ce que je veux être modifiable est le "IsApproved" case à cocher. Une fois que c'est cochée/décochée, j'ai besoin de la recherche de l'utilisateur, l'adresse e-mail et de mettre à jour lui/elle. J'espère que cela a du sens.
il y a peut-être des attributs, vous pouvez définir les propriétés de la viewmodel qui signifient eux-mêmes comme "non modifiable" - ce qui devrait aider: stackoverflow.com/questions/2876371/...
OriginalL'auteur xandercoded
Si vous voulez retourner à la liste des articles avec le modèle de la soumission, vous aurez besoin d'utiliser une boucle for, pas un foreach
si tout ce qu'il a changé, c'est le foreach pour pour il serait, donc, c'est une solution
eh bien, la chose est que vous êtes juste "en pointant quelque chose" - la réponse doit être plus profond que cela
désolé, je suppose que je voulais être poli en reconnaissant la accepté de répondre avant d'écrire la mienne. J'ai reformulé de manière à répondre à vos normes, même si le contenu est le même.
Je pense que vous avez un malentendu moi - regardez la accepté de répondre à cette question. il y a beaucoup de contenu qui explique la réponse ainsi que de fournir la solution. Ce n'est pas toujours nécessaire, mais si ce que vous voulez dire peut entrer dans la zone de commentaire et n'a pas de code/trucs qui ont besoin de mise en forme, puis la zone de commentaire est la place pour elle
OriginalL'auteur heilch
Matty la réponse de fonctionner.
Si vous voulez éviter d'avoir à spécifier un index (qui ne fonctionnent pas si vous avez eu une ICollection), vous pouvez définir un template enfant que Xander a expliqué.
L'avantage est que vous bénéficiez toujours de votre forte tapé intellisense dans le AdminContainerModel Vue et MVC crochets les éléments de retour dans votre Liste sur le post de retour pour vous sortir de la boîte.
Voici un exemple:
Principal de l'Éditeur de template (que Xander a dit):
AdminContainerModel Éditeur de modèle(Ce qui est appelée pour chaque élément dans votre Liste parce que vous avez appelé @Html.EditorForModel:
OriginalL'auteur Mark