MVC ViewBag dropdown Werte-parameter übergeben
In der Datenbank habe ich die Tabelle user und student. Ich generierte Modell mit Entity Framework. Da dieser Schüler-Klasse erzeugt hatte nur die Felder von student, aber nicht in form Benutzer, habe ich meinen eigenen Studenten-Klasse mit allen dieser Felder zu verwenden, wie viewmodel.
Bin ich mit meinen ViewBag zum übergeben von Daten für die dropdown-aus meiner Sicht.
ViewBag.Programs = Entities.Programs;
Programme Liste der Studiengänge an der Universität (z.B.: informatik, Recht, etc...)
So es ist 1:N-Beziehung, wo die Schüler können in nur einem Programm, aber das Programm studiert werden kann, indem mehr Studenten.
Und meiner Ansicht nutze ich DropDownFor zu machen dropdown-Liste, aus der das Programm zugeordnet ist die Studierenden, wenn neue student wird zur Datenbank Hinzugefügt.
<div class="editor-field">
@Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Name),
Value = option.ID.ToString(),
Selected = (Model != null) && (option.ID == Model.ID)
}), "Choose...")
@Html.ValidationMessageFor(model => model.ProgramID)
</div>
Problem ist, wenn ich Sie auf Formular Absenden-button, wird dieser Fehler angezeigt:
Exception Details: System.ArgumentNullException: Wert darf nicht null sein.
Parameter name: source
@Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem
Diesem Teil model => model.ProgramID
macht Fehler
Gut, ich habe versucht, zu vereinfachen problem damit, dass es keine anderen Dinge, die vielleicht unklar sein, so übersetzte ich meinen code auf Englisch, da der wirkliche code ist, mehr auf meine Muttersprache.
Ich denke der Fehler ist da, weil das ist, was der browser sagt. Hier ist der code, den es am original:
BEARBEITEN AKTION ZU ERHALTEN
//GET: /Unija/Studenti/Izmeni
public ActionResult Izmeni(int ID)
{
ViewBag.StudProgrami = Entities.Studijski_Program;
SSVN.ModelView.Student student = new SSVN.ModelView.Student();
SSVN.Models.Student stud = Entities.Students.Single(x => x.ID == ID);
Korisnik korisnik = Entities.Korisniks.Single(s => s.ID == ID);
student.ID = korisnik.ID;
student.KorisnickoIme = korisnik.Korisnicko_Ime;
student.Lozinka = korisnik.Lozinka;
student.Ime = stud.Ime;
student.Prezime = stud.Prezime;
student.BrojIndeksa = stud.Broj_Indeksa;
student.TrenutniSemestar = stud.Trenutni_Semestar;
student.StudijskiProgramID = stud.Studijski_Program_ID;
return View(student);
}
EDIT POST AKTION
//POST: /Unija/Studenti/Izmeni
[HttpPost]
public ActionResult Izmeni(SSVN.ModelView.Student student)
{
if (ModelState.IsValid)
{
Korisnik korisnikToUpdate = Entities.Korisniks.Single(x => x.ID == student.ID);
korisnikToUpdate.Korisnicko_Ime = student.KorisnickoIme;
korisnikToUpdate.Uloga_ID = Entities.Ulogas.SingleOrDefault(x => x.Naziv == "Student").ID;
Entities.SaveChanges();
SSVN.Models.Student studentToUpdate = Entities.Students.Single(x => x.ID == student.ID);
studentToUpdate.Ime = student.Ime;
studentToUpdate.Prezime = student.Prezime;
studentToUpdate.Broj_Indeksa = student.BrojIndeksa;
studentToUpdate.Trenutni_Semestar = student.TrenutniSemestar;
studentToUpdate.Studijski_Program_ID = student.StudijskiProgramID;
Entities.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}
ANSICHT
@model SSVN.ModelView.Student
@{
ViewBag.Title = "Izmeni";
}
<h2>Dodaj</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>Student</legend>
<div class="hidden-field">
@Html.HiddenFor(model => model.ID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.KorisnickoIme)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.KorisnickoIme)
@Html.ValidationMessageFor(model => model.KorisnickoIme)
</div>
<input type="hidden" name="Lozinka" value="lozinka" />
<div class="editor-label">
@Html.LabelFor(model => model.Ime)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Ime)
@Html.ValidationMessageFor(model => model.Ime)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Prezime)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Prezime)
@Html.ValidationMessageFor(model => model.Prezime)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.BrojIndeksa)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BrojIndeksa)
@Html.ValidationMessageFor(model => model.BrojIndeksa)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.TrenutniSemestar)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.TrenutniSemestar)
@Html.ValidationMessageFor(model => model.TrenutniSemestar)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StudijskiProgramID)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.StudijskiProgramID, ((IEnumerable<SSVN.Models.Studijski_Program>)ViewBag.StudProgrami).Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Naziv),
Value = option.ID.ToString(),
Selected = (Model != null) && (option.ID == Model.ID)
}), "Izaberite")
@Html.ValidationMessageFor(model => model.StudijskiProgramID)
</div>
<p>
<input type="submit" value="Izmeni" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
InformationsquelleAutor Vajda | 2011-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, dass
Entities.Programs
zurücknull
- und Innenseite der Ansicht, wenn Sie versuchen, zu nennen .Wählen Sie Erweiterung Methode erhalten Sie diese Ausnahme. Oder vielleicht sind Sie setzen dieseDropDownListFor
in einer Ansicht gerendert wurde von einer controller-action, die nicht alles, was im innerenViewBag.Programs
.Persönlich würde ich verwenden, Ansicht-Modelle.
Also beginnen wir mit der Definition:
haben dann eine controller-Aktion, die kümmern sich um das Auffüllen dieser Ansicht Modell:
und innerhalb der Ansicht:
und wenn Sie wollten, eine Vorauswahl einige der Optionen in der dropdown einfach den
ProgramID
Eigenschaft der view-Modell der entsprechende Wert in die Steuerung:wenn Sie auf Absenden klicken, was passiert? Welche controller-action aufgerufen wird? Wie sieht das aus? Sie füllen die
ViewBag.Programs
drin?Dies ist die Seite Bearbeiten, es heißt wie Get action im controller, dachte link auf Seite, in dieser Aktion, die ich füllen ViewBag und dass in das ich Auffüllen dropdown-Formular, das viewbag. Als die Seite zum Bearbeiten angezeigt wird, gibt es in der Regel Bearbeite ich, was ich brauche, und klicken Sie auf submit-button am unteren Rand der form, und ich bekomme diese Fehlermeldung. Edit post action im controller immer noch nicht genannt, dieser Fehler heappens, wenn Daten von der Seite gesammelt werden, in das Modell Klasse. So ist es vor der Bearbeitung [HttpPost] action im controller.
wenn der Fehler nicht passiert in der Ansicht-warum haben Sie show der DropDownList in Ihrer Frage sagen, dass
model => model.ProgramID
macht den Fehler? Ich verstehe wirklich nicht, was das problem ist, da Sie nicht genügend details liefern. Wenn Sie wollen, mir helfen zu können bitte zeigen, wie viel code wie möglich, so dass das problem zu reproduzieren.Ich code jetzt meine Frage, ich erklärte alle Details in meinen früheren Kommentar. Drop-down-Liste ist schwierig, da etwas nicht stimmt. Vielleicht die Art, wie ich es geschrieben, vielleicht Parameter gesendet, ich weiß es nicht wirklich. Wenn ich wüsste, wo der Fehler ist, werde ich es behoben. 🙂
InformationsquelleAutor Darin Dimitrov
Meine ModelState war ungültig, so dass controller zurückgegeben, der gleichen Ansicht.
Aber da in diesem controller habe ich noch nicht definiert ViewBag Listen meiner DropDownList geworfen Null Ausnahme.
Ich brauchte nur zu gehen diese Listen über ViewBag.
War dieses problem.
InformationsquelleAutor Vajda