ASP.NET MVC - la référence d'Objet n'est pas définie à une instance d'un objet
J'ai récemment pris plus de l'appui d'une ASP.NET projet MVC, et suis en train de travailler à travers certaines de ces erreurs, l'une en particulier m'a déconcerté si.
Nous avons une "Nouvelle page" pour ajouter de nouveaux éléments, avec le code suivant en cours d'exécution lorsque la page est affichée:
[HttpPost]
public ActionResult New(RecordView i)
{
if(ModelState.IsValid)
{
repository.AddRecord(i.DogIncident);
return View("Index");
}
return View("Index");
}
Toutefois, lorsqu'il essaie de charger la vue Index, j'obtiens l'erreur suivante: "la référence d'Objet n'est pas définie à une instance d'un objet". et il pointe vers le bloc de code suivant en haut d'un fichier appelé RecordsView.cshtml:
@for (var i = 0; i < Model.Records.Count; i++)
L'enregistrement n'ajouter correctement, il n'a tout simplement pas de charger les listes de la page correctement, et puisque c'est juste un "nice to have" je pensais simplifier les choses en changeant de sorte qu'elle renvoie un texte qui génère une erreur car il s'attend à un booléen retourné.
Toutes les idées sur la façon de résoudre ce problème s'il vous plaît? Je suis perplexe.
Merci!
- Vous essayez d'accéder à un modèle de votre point de vue, mais vous n'êtes pas la réussite de tous.
- Vous n'êtes pas le passage d'un modèle lors de l'appel de retour à la Vue("Index"); vous avez besoin de quelque chose comme le retour à la Vue("Index", someModel);
- Merci à vous, pardonnez mon ignorance, mais je suis de l'importation de mes modèles avec l 'aide de' instruction dans la partie supérieure de la page, et je veux inclure un appelé " Foo " par exemple, je veux faire Afficher("Index", Foo) ? c'est juste que c'est la génération d'une erreur pour moi
- créer un nouvel objet de type
Foo
:return View("Index", new Foo());
.
Vous devez vous connecter pour publier un commentaire.
Le flux de votre code ici ne regarde pas à droite:
À partir de votre description ci-dessus, il semble comme si vous êtes à la Publication à partir de votre
New
vue, à ceNew
d'action, qui devrait ensuite rediriger, en cas de succès, à votreIndex
action. Actuellement, le code ci-dessus n'est pas à faire ça, et c'est aussi ne pas réafficher le formulaire si le modèle n'est pas valide. Il doit probablement ressembler à ceci:La distinction importante entre
return View(...)
etreturn RedirectToAction(...)
est que ce dernier va exécuter l'action et retour de la vue associée. L'ancien sera tout simplement le retour de la vue. Qui a des implications en ce que si laIndex
d'action construit un modèle, et le transmet à laIndex
vue, rien de tout cela ne se passera si vous il suffit de retourner la vue.Vous pouvez bien sûr faire quelque chose comme:
mais ce n'est pas d'aller travailler si, comme discuté ci-dessus, votre
Index
effectue certaines autres données de la construction de votre modèle, comme la construction de listes déroulantes, quinew YourModelType()
ne le ferais pas.Aussi, lorsque des données qui est envoyé à un POSTE d'action est valide, vous devriez être rediriger vers une autre action (comme je l'ai fait ci-dessus), plutôt que de simplement retourner une vue, afin de les rendre conformes à la Post-Rediriger-Get modèle, ce qui évite certains types de dupliquer les soumissions de formulaire.
return View(...)
etreturn RedirectToAction(...)
était le problème. J'ai utiliséreturn View()
qui n'a pas l'appel de la méthode d'action dans mon contrôleurSi
Records
est une liste, assurez-vous que votre ViewModel a un constructeur:Vous d'affichage d'Index de la vue, et il semble que cela nécessite un peu de Modèle de Modèle.Les enregistrements. Et vous ne passez pas dans cette HttpPost action.
Si vous avez d'action pour que la page d'Index, alors vous pouvez simplement faire
Il suffit de rediriger un utilisateur à l'Index de la vue, après la création de la nouvelle RecordView élément
Fondamentalement, vous pouvez essayez d'atteindre
PRG
(Post/Redirect/Get) modal.Je pense, le problème est que vous n'êtes pas d'envoyer le modèle de votre requête GET.
Post--> Enregistrer --> Redirect --> Charger des Données -->Attribuer à Vue dans l'Index -->Accès en vue
//POSTER & REDIRIGER
//OBTENIR
Index.cshtml
Vous avez mentionné que le record ajoute correctement, de sorte que vous devez être en train de passer d'un enregistrement valide modèle de votre point de vue à partir d'une autre action que celle prévue.
Si
@for (var i = 0; i < Model.Records.Count; i++)
est la cause de cette erreur, ma conjecture est que le modèle existe, mais laRecords
propriété n'a pas été définie. Un travail immédiat autour de serait vérification de l'existence de cette propriété avant d'y accéder. Par exemple:je pense que vous avez les collections ne sont pas instanciés, l'erreur peut être dans modèles dans les modèles de vue. cela parce que quand vous avez une collection, vous devez instancier à l'intérieur du constructeur de cette entité.