2016-11-18 6 views
0

Ich bin neu bei asp.net mvc und habe Probleme, DropDownList mit der im Titel erwähnten Fehlermeldung zu validieren.Es gibt kein ViewData-Element vom Typ 'IEnumerable <SelectListItem>' mit dem Schlüssel 'FirstMentor'

Mein Controler:

public ActionResult SelectMentors(int courseId) 
    { 

     var mentors = db.Mentor.Where(m => m.CoursesId == courseId). 
           Select(x => new SelectListItem 
           { 
            Value = x.FullName, 
            Text = x.FullName, 

           }); 

     ViewBag.MentorList = mentors; 

     return View(); 
    } 


    [HttpPost] 
    public ActionResult SelectMentors(StudentSelections model) 
    { 

     if (ModelState.IsValid) 
     { 
      db.StudentSelection.Add(model); 
      db.SaveChanges(); 


      return RedirectToAction("Index", "Home"); 
     } 
     else 

     return View(); 
    } 

SelectMentors Modell

public class StudentSelections 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    [Display(Name="Name")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "LastName")] 
    public string LastName { get; set; } 

    [Display(Name = "E-mail adress")] 
    public string Email { get; set; } 

    [Required] 
    [Display(Name = "1.")] 
    public string FirstMentor { get; set; } 

}

Und meine Ansicht:

 @Html.LabelFor(model => model.FirstMentor, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.FirstMentor, (IEnumerable<SelectListItem>)ViewBag.MentorList, "-- select --", new { @class = "form-control" }) 

      @Html.ValidationMessageFor(model => model.FirstMentor) 
     </div> 
    </div> 

Daten für Mentoren aus der Datenbank retriving und über ViewB weitergegeben ag in Ansicht mit StudentSelections Modell kombiniert, occures Fehler beim filds Pflicht

Antwort

0

fehlt nicht ViewBag es verwenden, Do not Pass durch das Modell:

public class StudentSelections 
{ 
    //... 
    public IEnumerable<SelectListItem> MentorList { get; set; } 
} 

Controller:

public ActionResult SelectMentors(int courseId) 
{ 

    var mentors = db.Mentor.Where(m => m.CoursesId == courseId). 
          Select(x => new SelectListItem 
          { 
           Value = x.FullName, 
           Text = x.FullName, 

          }); 

    ViewData.Model = new StudentSelections 
    { 
     MentorList = mentors 
    }; 

    return View(); 
} 

On View:

@Html.DropDownListFor(model => model.FirstMentor, 
Model.MentorList, 
"-- select --", 
new { @class = "form-control" }) 
1

Ich nehme an, Sie meinen, dass Fehler ist, nachdem Sie einen POST zu den s Server und Validierung schlägt fehl. Wenn Sie Ihre Post-Aktion validieren, wenn Ihre ModelState gültig ist, dann führen Sie Ihre Logik aus und leiten den Benutzer zur Index-Aktion um, aber was passiert, wenn der ModelState nicht gültig ist?

Sie geben die Ansicht zurück, aber Sie füllen nicht die Daten für die Mentorenliste im ViewBag, daher schlägt die Seite fehl.

So etwas sollte funktionieren:

[HttpPost] 
public ActionResult SelectMentors(StudentSelections model) 
{ 
    if (ModelState.IsValid) 
    { 
     db.StudentSelection.Add(model); 
     db.SaveChanges(); 


     return RedirectToAction("Index", "Home"); 
    } 
    //NOTE: You don't need this 'else' because if everything is OK you'll redirect 

    //At this point, an error has occurred. 

    //Populate the mentors in the view bag. 
    var mentors = db.Mentor.Where(m => m.CoursesId == courseId). 
          Select(x => new SelectListItem 
          { 
           Value = x.FullName, 
           Text = x.FullName, 

          }); 
    ViewBag.MentorList = mentors; 

    //return the view 
    return View(); 
} 

Siehe this fiddle.

Hoffe, das hilft!

+0

Das ist kein OP-Problem.OP haben Problem auftritt, wenn er sehen –

+0

10 @teovankot Sie sicher? Ich nahm an, dass "Fehler auftritt, wenn Required filds missing", dass OP eine Post macht, ModelState ungültig ist und die Seite nicht geladen werden kann, da sich in der Viewbag für MentorList nichts befindet. Ich stimme zu, dass die Verwendung des Modells ein besserer Ansatz ist, aber OP sollte in diesem Fall keine Fehler mit ViewBag bekommen. Sieh die Geige in meiner Antwort. –

+0

Ok, mein Schlechter, könntest du Recht haben –

1

EDIT

@KarelTamayo hat seine Antwort seit undeleted, aber ich mein nur für die Beratung verlassen in jeder Aktion ein gemeinsames Verfahren zur Verwendung beide Aktionen aufrufen können stattdessen den gleichen Code zu wiederholen.

ORIGINAL ANTWORT

Ich bin mir nicht sicher, warum @KarelTamayo seine Antwort gelöscht, aber das scheint genau das zu sein, was hier passiert. Das OP sagt eindeutig, dass dies passiert, wenn das Formular die Validierung nicht besteht, was bedeutet, dass er in der POST-Version der Aktion ist. Außerdem ist nichts falsch an der GET-Version der Aktion, die dieses Problem verursachen würde, aber in der POST-Version wird ViewBag.MentorList niemals festgelegt. Das ist das Problem. Der Code in Ihrer GET-Aktion, der ViewBag.MentorList setzt, muss ebenfalls in Ihrer POST-Aktion enthalten sein. Um die Dinge trocken zu halten, können Sie sie in eine andere Methode auf Ihrem Controller ausklammern:

private void SetMentorList() 
{ 
    var mentors = db.Mentor.Where(m => m.CoursesId == courseId). 
          Select(x => new SelectListItem 
          { 
           Value = x.FullName, 
           Text = x.FullName, 

          }); 

    ViewBag.MentorList = mentors; 
} 

public ActionResult SelectMentors(int courseId) 
{ 
    SetMentorList(); 
    return View(); 
} 

[HttpPost] 
public ActionResult SelectMentors(StudentSelections model) 
{ 

    if (ModelState.IsValid) 
    { 
     db.StudentSelection.Add(model); 
     db.SaveChanges(); 


     return RedirectToAction("Index", "Home"); 
    } 

    SetMentorList(); 
    return View(); 
} 
+0

@ChrissPratt Ich löschte die Antwort, weil ich dachte, dass OP ein wenig mehr über das Problem klären musste. Es war nicht klar, wann das Problem passierte, oder? Ich denke, wenn wir wenigstens anderen helfen wollen, sollten wir ihr Problem nicht erraten :-). Ich habe es dann wiederhergestellt, damit OP es sich ansehen und bestätigen konnte. Das Refactoring in die SetMentorList-Methode ist übrigens eine großartige Ressource. Besonders, wenn Sie viele zu füllende Listen haben. –

Verwandte Themen