2016-05-18 8 views
0

Ich kratze meinen Kopf von vergangenen zwei Tagen, einschließlich Informationen für das, was ich versuche zu bauen.Wie bekomme ich Wert für IList <model> über Formular und übergeben Sie es an den Controller in MVC

Funktionalität Ich versuche zu bauen: einfache Reise-Manager-Anwendung

Get Werte für Reise Namen und Anzahl der Personen auf Index-Seite und senden Sie es, die in einer anderen Form führt (View), wo nach Anzahl der Personen textboxen werden erzeugt und geben diese Formulardaten an einen anderen Controller weiter, wo ich sie in der Datenbank speichern werde.

Modelle: Reise

public class Trip 
    { 
     public Trip() 
     { 
      //people = new List<People>(); 
     } 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public decimal Income { get; set; } 
     public decimal Expense { get; set; } 
     public int NumberOfPeople { get; set; } 
     public virtual IList<People> people{ get; set; } 
    } 

Menschen

public class People 
    { 
     public int Id { get; set; } 
     public int TripId { get; set; } 
     [DisplayName("Name:")] 
     public string Name { get; set; } 
     [DisplayName("Initial Deposite:")] 
     public decimal InitialDeposite { get; set; } 


    } 

Dies ist, wie Index.cshtml Blick aussieht, hier nehme ich zwei Eingänge Name und Anzahl der Personen:

@model TripManager.Models.Trip 
@{ 
    ViewBag.Title = "Welcome to Trip Manager"; 
} 

<div class="jumbotron"> 
    <h1>Trip Manager</h1> 
    <p class="lead">Trip Manager helps you calculate your group trip expenses in ease.</p> 
</div> 

<div class="row"> 
    <div class="col-md-12 text-center"> 
      @using (Html.BeginForm("Index","Trip")) 
      { 

       @Html.AntiForgeryToken(); 
       @*@Html.HiddenFor(m=>m.Id)*@ 
       <p class="text-info">@Html.LabelFor(m => m.Name)</p> 
       <p class="glyphicon-search">@Html.EditorFor(m => m.Name) @Html.ValidationMessageFor(m => m.Name)</p> 


       <p class="text-info">@Html.LabelFor(m => m.NumberOfPeople)</p> 
       <p class="glyphicon-search">@Html.EditorFor(m => m.NumberOfPeople) @Html.ValidationMessageFor(m => m.NumberOfPeople)</p> 
       <p><input type = "submit" class="btn-success" name="btnTripInit" value="Go Trip" /></p> 
      } 
    </div> 
</div> 

diese Eingabe Passing Ansicht über die Steuerung Post Aktion Index (Trip Reise), die als unten member.cshtml,

public ActionResult Index(Trip trip) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(trip); 
    } 

    var mytrip = new Trip(); 
    mytrip.Name = trip.Name; 
    mytrip.NumberOfPeople = trip.NumberOfPeople; 
    mytrip.people = new List<People>(trip.NumberOfPeople); 

    return View("Members", trip); 
} 

und members.cshtml Ansicht ist, wie weiter unten ... hier i Textfeld am Erzeugen IList in Reise Modell .... Eine Textbox für Namen und andere für Initial Deposite

@model TripManager.Models.Trip 
{ 
    @ViewBag.Title = "Please Enter Members Details"; 
} 
<div class="row"> 
    <div class="col-md-12 text-center"> 
     @{ 
      using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post)) 
      { 
      <hr /> 
      @Html.HiddenFor(m=>m.Id) 
       for(int i=0;i<Model.NumberOfPeople;i++) 
       { 
       <p>Member @i Details</p> 
       @Html.HiddenFor(m => m.people[i].Id) 
       <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"}) 
       | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" }) 
       </p> 
       } 
      <hr /> 
      <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p> 
      } 
    } 
    </div> 
</div> 

Nun, wie soll ich das Formulardaten an die Steuerung senden und es an die DB über EntityFramework speichern ???

public ActionResult FeedMemberData(Trip trip) 
{ 
    //TODO 
} 

hier für Reise, die ich bin immer null ....

Antwort

0

Wenn das Trip-Objekt, das Sie an die Controller-Methode gebucht werden erwarten null ist, finde ich, dass es in der Regel durch ein Problem verursacht wird, mit Die HTML-Seite posten die Daten nicht korrekt oder mit dem MVC-Modellbinder, der die Formulardaten nicht ordnungsgemäß in das Modell auflösen kann (in diesem Fall das Trip-Objekt), von dem Sie erwarten, dass es auf Ihrem Server veröffentlicht wird.

Wenn ich rate, was Sie in Ihrer Methode "FeedMemberData" veröffentlichen, ist eigentlich eine Reihe von Personen und nicht das Trip-Objekt, das Sie als Ihr Modell verwenden. Versuchen Sie es unten und sehen Sie, ob der Modellordner die Postdaten an eine Liste bindet.

+0

No @ Jonathan Eigentlich bin Entsendung i Trip und meine Reiseklasse hat IList . – BakerStreet221

+0

@ Pratham, sorry, ich könnte nicht mehr Hilfe sein. Haben Sie versucht, ein Tool wie [fiddler] (http://www.telerik.com/fiddler) zu verwenden?Wenn ich eine Controller-Aktion habe, die mir Daten gibt, die falsch sind oder die ich nicht erwartet habe, kann ich dieses kostenlose Tool verwenden, um genau zu diagnostizieren, was an den Server gesendet wird. Beachten Sie auch, dass ich meine Antwort so bearbeitet habe, dass sie das [HttpPost] -Attribut enthält, da ich gerne explizite Daten erhalte, wenn ich Daten von einem Formular erhalte, dessen Controller-Aktion den Formularbeitrag erwartet. –

+0

Dank für Anregungen über Fiddler @jonathan. Ich konnte die richtigen Daten zurück zum Controller schreiben – BakerStreet221

0

Problem wurde später identifiziert, einige Änderungen vorgenommen und es hat funktioniert.

Allgemeiner Hinweis:

Wenn Sie Problem wie IEnumerable Rückkehr null-Controller konfrontiert sind, Stellen Sie sicher, Indizierung von 0 beginnen, während die Daten zu IList Fütterung

@model TripManager.Models.Trip 
{ 
    @ViewBag.Title = "Please Enter Members Details"; 
} 
<div class="row"> 
    <div class="col-md-12 text-center"> 
     @{ 
      using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post)) 
      { 
      <hr /> 
      @Html.HiddenFor(m=>m.Id) 
      //this must start from 0 
       for(int i=0;i<Model.NumberOfPeople;i++) 
       { 
       <p>Member @i Details</p> 
       @Html.HiddenFor(m => m.people[i].Id) 
       <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"}) 
       | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" }) 
       </p> 
       } 
      <hr /> 
      <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p> 
      } 
    } 
    </div> 
</div> 
Verwandte Themen