2017-01-16 4 views
-1

Ich mache meine MVC-Anwendung. Ich erschaffe eine Form mit einem Tisch darin. Eine Tabelle soll Benutzer und Noten enthalten, die sie haben (so etwas wie Notenblatt in Schulen). Ich möchte, dass die Markierungen änderbar sind, also habe ich sie vom Typ TextBox mit dem Standardwert wie in der Datenbank gemacht, aber scheinbar, wenn ich die Schaltfläche "Änderungen anwenden" drücke, sieht der Controller die Liste aller Markierungen als null. Wieso ist es so?
My View (ein Teil davon):MVC-Ansicht Nullwert zurückgeben

@Scripts.Render("~/bundles/jquery") 
@Scripts.Render("~/bundles/bootstrap") 
@model ClassDeclarationsThsesis.Models.ClassesViewViewModel 


@{ 
    ViewBag.Title = "ClassesView"; 
} 
<h2>ClassesView</h2> 
<select id="sel"> 
    <option value="week">Current week</option> 
    <option value="total">Total</option> 
</select> 
@{ 
    int i = 0; 
    int inside = 0; 
} 
@using (Html.BeginForm("ClassesView", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 
     <div id="week"> 
     <table border="1" width="500"> 
      <tr> 
       <th>Surname</th> 
       <th>Name</th> 
       @foreach (var task in Model.current) 
       { 
        <th>@task.name</th> 
       } 
       <th>Total</th> 
      </tr> 
      @{ 
       int counter = 0; 
       int counter1 = 0; 
      } 
      @foreach (var user in Model.curr_users) 
      { 

       if (user.user_type.Replace(" ", String.Empty) == 1.ToString()) 
       { 

        <tr> 
         <th>@user.surname</th> 
         <th>@user.name</th> 
         @foreach (var task in Model.current) 
         { 
          foreach (var grade in Model.grading) 
          { 
           if (user.user_id == grade.user_id) 
           { 
            if (task.task_id == grade.task_id) 
            { 
             inside = task.value; 
             i = i + task.value; 
             counter1++; 
            } 

           } 

          } 
          <th>@Html.TextBoxFor(m => m.points[counter + counter1 - 1], new { @class = "form-control", @Value = @inside, style = "width:50px;" })</th> 
          inside = 0; 
         } 
         <th> 
          @i 
         </th> 
         @Html.HiddenFor(m => m.class_id) 
         @Html.HiddenFor(m => m.student_id) 
        </tr> 
       } 
       i = 0; 
       counter++; 
      } 
     </table> 
     <input type="submit" class="btn btn-default" value="Apply changes" /> 

    </div> 
       } 

points, die ich hier List<int> in ClassesViewViewModel verwendet. Was mache ich falsch?
EDIT:
Added der Controller:

public ActionResult ClassesView(ClassesViewViewModel value) 
{ 
    ClassDeclarationsDBEntities4 entities = new ClassDeclarationsDBEntities4(); 
    ClassesViewViewModel model = new ClassesViewViewModel(); 
    model.users = entities.Users.ToList(); 
    model.tasks = entities.Tasks.ToList(); 
    model.group_id = value.group_id; 
    model.class_id = value.class_id; 
    model.grading = entities.Gradings.ToList(); 
    model.s_u = entities.Subjects_Users.ToList(); 
    model.t = new List<ClassDeclarationsThsesis.Classes.Task>(); 
    model.current = new List<ClassDeclarationsThsesis.Classes.Task>(); 
    model.curr_users = new List<ClassDeclarationsThsesis.Classes.User>(); 
    DateTime max = DateTime.MinValue; 
    foreach (var task in model.tasks) 
    { 
     if (task.class_id == model.class_id) 
     { 
      model.t.Add(new ClassDeclarationsThsesis.Classes.Task(task.task_id, task.class_id, task.name, task.points, task.deadline)); 
     } 


    } 
    foreach (var task in model.t) 
    { 
     if (DateTime.Compare(task.deadline, max) > 0) 
     { 
      max = task.deadline; 
     } 
    } 
    foreach (var task in model.t) 
    { 
     if (DateTime.Compare(task.deadline, max) == 0) 
     { 
      model.current.Add(task); 
     } 
    } 
    foreach (var s_u in model.s_u) 
    { 
     if (s_u.class_id == model.class_id && s_u.group_id == model.group_id) 
     { 
      foreach (var user in model.users) 
      { 
       if (user.user_id == s_u.user_id) 
       { 
        model.curr_users.Add(new ClassDeclarationsThsesis.Classes.User(user.name, user.surname, user.user_id, user.user_type, user.email, user.password)); 
       } 

      } 
     } 

    } 

    if (ModelState.IsValid) 
    { 
     for(int i=0;i<model.points.Count();i++) 
     { 
      //getting null here 
     } 
    } 
    else 
    { 
     return View(model); 
    } 


    return View(model); 
} 
+0

Zeigen Sie uns bitte Ihren Controller-Code. – Yogi

+0

@Yogi siehe bitte bearbeiten. –

+1

Es ist schwer mit diesem Code zu sagen, aber wahrscheinlich, weil Ihre Indizes nicht sequentiell sind und/oder nicht mit Null beginnen. Damit die Modellbindung funktioniert, müssen Listenindizes mit Null beginnen und ohne Lücken sequenziell sein. – GSerg

Antwort

1

1) Sie sollten den "Wert" als "Modell" bei Httppost Aktionsmethode ändern.

public ActionResult ClassesView(ClassesViewViewModel model) 

2) Es gibt eine Menge von Zeile zu Ihrer Aktion method.You Repository und Service erfahren sollte patterns.Briefly Sie die db Lesung setzen sollen, Einfügen, Aktualisieren Zeile in einem Repository sollte class.You Repository-Klassen machen für jede Entitäten. Geschäftslogik (Validierung usw.) muss in den Serviceklassen enthalten sein.

-1

Okay, also habe ich die Antwort gefunden. Ich änderte value in Controller zu model und korrigierte auch den Zähler in Sicht, um sicherzustellen, dass die Werte fortlaufend sind, beginnend bei 0. Vielen Dank für Ihre Unterstützung.

+1

Warum haben Sie dann eine Antwort akzeptiert, die nichts mit Ihrem Problem zu tun hat - das Ändern des Parameternamens hat damit nichts zu tun (außer Ihr Modell hat einen Eigenschaftsnamen 'value 'was es scheint nicht zu haben) –

+0

@StephenMuecke hatte es einen Eigenschaftsnamen' Wert' Wie in Edit angegeben. Das Ändern war nicht die volle Lösung, also fügte ich meine Lösung hinzu, die funktionierte. –

+1

Kann nichts in Ihrer Editierung sehen, die darauf hinweist, dass Sie eine Eigenschaft namens 'value' haben :) –