10
votes

Le modèle de liaison ne fonctionne pas

J'ai les classes de poco suivantes: xxx pré>

et une classe de modèle de vue p> xxx pré>

dans mon formulaire de création, j'ai défini le modèle comme p> xxx pré>

et avoir des champs comme les éléments suivants: p>

[HttpPost]
        public ActionResult Create(LocationViewModel location)
        {
            if (ModelState.IsValid) {
                locationRepository.InsertOrUpdate(location.Location);
                locationRepository.Save();
                return RedirectToAction("Index");
            }
            location.SelectPlayerTypes = golferTypeRepository.All.Where(p => p.IsActive).ToList();
            return View(location);
        }


5 commentaires

Je pourrais être éteint, mais je pense que votre initialisation emplacement dans le constructeur le jette. Pouvez-vous essayer de supprimer cette ligne (et instantirant la propriété en dehors du modèle lui-même)?


Je l'ai instancié dans la création d'ActionResult (pas le message) et maintenant, lorsque je poste, l'emplacement est null.


Oui, c'est ce que j'espérais essayer. Oh bien, suppose que ce n'était pas la question.


Lorsque vous dites que rien des propriétés ne doit être définie sur les valeurs entrées dans le formulaire - où / comment déterminez-vous cela?


J'ai mis à jour le constructeur de création pour être PublicResResult Créer (emplacementviewModel modèle, emplacement de localisation) et fonctionne.


10 Réponses :


50
votes

Voici le problème:

[HttpPost]
public ActionResult Create(LocationViewModel model)


3 commentaires

Je ne peux pas m'empêcher de rire comment ça m'a fait ressentir la décharge pendant quelques minutes


Arrivé à moi aussi, bonne réponse!


J'ai eu une classe avec une propriété de modèle pour faire / modèle d'un véhicule. Bien sûr, mon paramètre transcuté était modèle . facepalm



0
votes

Cela a sauvé ma journée. IAD Les éléments suivants: xxx

ConclusionView a une propriété nommée conclusion donc j'ai presque perdu mon esprit.


0 commentaires

35
votes

Juste pour contribuer une autre raison possible: j'ai passé quelques heures à chercher une erreur dans mon code et que la raison du liant ne fonctionne pas dans mon cas utilisait un modèle avec des champs publics plutôt que des propriétés publiques:

public int CustomerName { get; set; }


5 commentaires

Souhaite accordé - m'a sauvé de souffler un joint aujourd'hui. J'ai eu tous les champs et aucune propriété. Tous les liens HTML n'avaient aucun détail. Merci d'avoir ajouté cette réponse supplémentaire, @grzegorz.


Dieu, j'ai passé tellement de temps à essayer de comprendre ça! Merci!


Cette réponse a également aidé à me rappeler que les propriétés doivent être Public .


C'était la question dans mon cas. Merci!


Omg c'était mon problème et je cherchais cela si longtemps. Honte sur ce liant modèle, Newtonsoft peut le faire sans getter et setter :(



2
votes

Permettez-moi d'ajouter ici une autre raison pour laquelle le classeur de modèle ne fonctionnerait pas correctement.

J'ai eu un modèle avec la propriété contact téléphone , quelque part sur la façon dont j'ai décidé de changer le nom de cette Propriété à Téléphone , puis toute une liaison de modèle soudaine pour cette propriété a cessé de fonctionner lorsque j'essayais de créer une nouvelle instance.

Le problème était sur le Créer < / Code> Action dans mon contrôleur. J'ai utilisé l'échafaudage Visual Studio par défaut et il a créé la signature de la méthode comme suit: xxx

Faites attention à l'attribut lid , l'échafrogder créé. Les champs utilisant le nom d'origine ContactTone et car il s'agit d'une chaîne, il n'a pas été refacturé. Comme le nouveau champ Téléphone n'était pas inclus, la valeur a été ignorée par le classeur de modèle.

J'espère que cela sauve l'heure de quelqu'un.

Bonne chance!


0 commentaires

0
votes

Je sais qu'il est trop tard pour commenter cela. Ce que j'ai fait est ajouté le paramètre moins constructeur dans le point de vue et tout a fonctionné génial.


0 commentaires

5
votes

Également en retard pour rejoindre la fête, mais après 3 ans d'ASP.NET MVC, j'ai rencontré que les intrants handicapés ne sont pas affichés, le classeur de modèle ne peut donc pas le lier bien sûr. Voir ici :

"Les éléments désactivés dans un formulaire ne seront pas soumis".

Meilleure utilisation Readonly = "Readonly" sur désactivé. Voir ici .


0 commentaires

1
votes

et une autre raison: Normalement, j'utilise les éditeurs intégrés ou les écrans pour et n'auraient jamais rencontré ce problème. Cependant, dans ce cas, j'ai besoin d'un contrôle semi-personnalisé. Fondamentalement, une descente avec de nombreux attributs de données sur les options.

Ce que je faisais, pour mon étiquette Select était: xxx

maintenant tout positionnait et à la œil non formé, il semblait que tout devrait fonctionner et lier. Cependant, l'assistant d'identité rend les modèles sous pression avec un soulignement. Le classeur de modèle n'interprète pas les soulignements comme indicateur de hiérarchie de classe. Ce qui devrait se séparer, c'est un point. Qui vient de namefor: xxx

nom pour corriger tous mes problèmes.


0 commentaires

3
votes

Juste pour réitérer ce que disait TOD, le liant modèle nécessite un attribut "nom" sur l'élément HTML pour mapper les propriétés. Je faisais un test de test rapide à la main et utilisé uniquement l'attribut «ID» pour identifier mes éléments.

Tout est tombé en place lorsque j'ai ajouté l'attribut "nom". xxx


0 commentaires

1
votes

Pour que quiconque ait toujours des problèmes avec cela, si vous nommez votre paramètre dans votre méthode de poste pour être identique à l'une de vos propriétés, le modèle de modèle par défaut échouera également.


0 commentaires

1
votes

Le mien était un cas unie, mais j'espère que cela aide quelqu'un dans un contexte similaire. J'ai eu mon point de vue Mise en œuvre d'ivenidatableObject et la méthode de validation de cette interface renvoie une nullide si le succès. Il devait retourner un iénumérable vide. Par conséquent, la liaison était en train de se produire mais de s'écraser.

Fondamentalement lorsque vous obtenez ce problème, utilisez Fiddler pour examiner les données postées, assurez-vous que les variables affichées correspondent aux propriétés (non champs!) Sur votre mode de vue et mettez un point de rupture sur le constructeur de modèle d'affichage pour assurer le routage. Le moteur frappe la méthode postale correcte. Bonne chance!


0 commentaires