MVC3 asp.net erreur: la Valeur ne peut pas être null. Nom du paramètre: articles sur dropdownlist
Je reçois une décharge dans le serveur et non pas dans mon système local lorsque vous essayez d'afficher les données. Il y a une page qui présente une certaine valeur à la base de données. J'ai aussi modélisé la liste déroulante de la page comme obligatoire. Cependant, lorsque l'on clique sur "Créer", au lieu de donner une erreur comme "Manquant"; il jette à un dépotoir.
De vidage de trace:
Value cannot be null.
Parameter name: items
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: items
Source Error:
Line 65: </div>
Line 66: <div class="editor-field">
Line 67: @Html.DropDownListFor(x => x.ProjectName, new SelectList(Model.ProjectDetail, "ProjectName", "ProjectName"),"")
Line 68: <span runat="server" style="color:Red;" visible="false"> *</span>
Line 69: @Html.ValidationMessageFor(model => model.ProjectName)
Source File: d:\hosting1178048\html\fbpm\fbpm\Views\User\Create.cshtml Line: 67
Trace De La Pile:
[ArgumentNullException: Value cannot be null. Parameter name: items] System.Web.Mvc.MultiSelectList..ctor(IEnumerable items, String dataValueField, String dataTextField, IEnumerable selectedValues)
+289714 System.Web.Mvc.SelectList..ctor(IEnumerable items, String dataValueField, String dataTextField) +19 ASP._Page_Views_User_Create_cshtml.Execute() in d:\hosting1178048\html\fbpm\fbpm\Views\User\Create.cshtml:67 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81 System.Web.WebPages.StartPage.RunPage() +17
Le code du Contrôleur:
public ActionResult Create()
{
var model = new UserDetail
{
ProjectDetail = db1.ProjectDetails.ToList()
};
return View(model);
}
//
//POST: /User/Create
[HttpPost]
public ActionResult Create(UserDetail userdetail)
{
if (ModelState.IsValid)
{
db.UserDetails.Add(userdetail);
db.SaveChanges();
return RedirectToAction("SearchCust");
}
return View(userdetail);
}
Le code de la vue:
@model fbpm.Models.UserDetail
@{
ViewBag.Title = "Create Customer";
}
<h2>Create Customer</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Customer Detail</legend>
<div id ="left" style="float:left; width:400px;">
<div class="editor-label">
@Html.LabelFor(model => model.UserID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserID)
<span runat="server" style="color:Red;" visible="false"> *</span>
@Html.ValidationMessageFor(model => model.UserID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
<span runat="server" style="color:Red;" visible="false"> *</span>
@Html.ValidationMessageFor(model => model.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PANNo)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PANNo)
@Html.ValidationMessageFor(model => model.PANNo)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.EmailID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EmailID)
@Html.ValidationMessageFor(model => model.EmailID)
</div>
<br />
<p>
<input type="submit" value="Create Customer" />
</p>
</div>
<div id = "left3" style="float:left; width:400px">
<div class="editor-label">
@Html.LabelFor(model => model.ProjectName)
</div>
<div class="editor-field">
@Html.DropDownListFor(x => x.ProjectName, new SelectList(Model.ProjectDetail, "ProjectName", "ProjectName"),"")
<span runat="server" style="color:Red;" visible="false"> *</span>
@Html.ValidationMessageFor(model => model.ProjectName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.BookedDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BookedDate)
<span runat="server" style="color:Red;" visible="false"> *</span>
@Html.ValidationMessageFor(model => model.BookedDate)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.BookedAmount)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BookedAmount)
<span runat="server" style="color:Red;" visible="false"> *</span>
@Html.ValidationMessageFor(model => model.BookedAmount)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact1)
@Html.ValidationMessageFor(model => model.Contact1)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Contact2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Contact2)
@Html.ValidationMessageFor(model => model.Contact2)
</div>
</div>
<div id="left1" style="float:left; width:400px;">
<div class="editor-field">
@Html.HiddenFor(model => model.Role, new { @readonly = "readonly", @Value = "400" })
@Html.ValidationMessageFor(model => model.Role)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FullAddress)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.FullAddress)
@Html.ValidationMessageFor(model => model.FullAddress)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.State)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.State)
@Html.ValidationMessageFor(model => model.State)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Country)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Country)
@Html.ValidationMessageFor(model => model.Country)
</div>
</div>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "SearchCust")
</div>
J'ai beaucoup cherché sur le net et trouvé que l'ajout d'un viewbag pour le nom du projet dans l'action soumettre avant de retourner à la vue owuld aider à, mais il na pas. Svp quelqu'un peut-il aider?
Ce qui concerne
OriginalL'auteur Hariprasauth Ramamoorthy | 2013-06-08
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous ne voyez cette exception lorsque votre insertion échoue; puis, vous essayez de réutiliser le
UserDetail
modèle dans la vue pour la même page.L'erreur que vous voyez est en raison de la nature du travail avec HTTP - tout ce qui n'est pas directement lié à une entrée est pas conservés. Donc, lorsque vous essayez de reconstruire la vue, la liste que vous essayez de lier la liste déroulante helper est null, depuis
UserDetail.ProjectDetail
n'a pas été repeuplée. Vous pouvez résoudre ce problème comme suit:De nada. Si vous êtes nouveau à l'MVC, vous pourriez trouver la NerdDinner tutoriel utile: wrox.com/WileyCDA/Section/id-321793.html. Sinon, c'est le meilleur livre que j'ai trouvé: amazon.com/Pro-ASP-NET-MVC-Adam-Freeman/dp/1430242361.
Le modelbinder prend les valeurs et les tentatives de les faire correspondre à des propriétés dans la classe du modèle, si un modèle est utilisé dans l'action de la déclaration.
Si je comprends bien ce que vous demandez, alors oui. Dans le chargement initial de la page (GET), la ProjectName propriété est renseignée. Ces valeurs ne sont pas dans le POST de l'action (quand le formulaire est soumis), car ils ne sont pas liés à un élément de formulaire.
La dernière version semble être MVC4 (nerddinner.codeplex.com/SourceControl/latest#mvc4), mais le processus n'a pas beaucoup de changement. À part le passage du Rasoir, la plupart des différences sont probablement cosmétiques. Sinon, le lien Amazon j'ai également proposé est pour un MVC4 version d'un assez décent Apress livre sur le sujet. La version eBook est un peu moins cher: apress.com/9781430242369
OriginalL'auteur Tieson T.
J'ai remarqué que le bouton créer est un bouton de soumission
Et il doit appeler à l'action avec la HttpPost attribut
[HttpPost]
public ActionResult Créer(UserDetail userdetail)
Dans cette action, il retourne Vue(userdetail);
Mais ce userdetail objet est créé par le modèle de liaison de la soumettre des données à partir du navigateur.
Afin de ne pas avoir des valeurs dans ProjectDetail propriété.
Vous pouvez le faire à travers
Je veux dire vous avez besoin de mettre un point de rupture dans [HttpPost] public ActionResult Créer(UserDetail userdetail) pour vérifier si elle a de la valeur pour ProjectDetail. Si non, vous devez recharger ProjectDetail dans cette action.
Ok. En réalité, la décharge ne se produit que dans le serveur. Pouvez-vous svp me dire comment je peux le recharger dans cette action?
utilisez simplement ProjectDetail = db1.ProjectDetails.ToList()
OriginalL'auteur flyfrog