2016-07-07 3 views
0

Mein Problem ist, dass bei der Verwendung von Grid.Mvc meine Ansicht null zu meinem Controller zurückgibt, wenn es einen List<Client> als Parameter erwartet, aber wenn es FormColletion erwartet, funktioniert es gut.Grid.Mvc gibt null zum Modell zurück, wenn die Liste erwartet wird

Ich versuchte mit regulären html Tabellen und es funktioniert korrekt.

Unten ist mein Code.

Modell:

public class Client 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public double Valor { get; set; } 
} 

Controller:

[HttpGet] 
    public ActionResult Index() 
    { 
     return View(clients); 
    } 

    [HttpGet] 
    public ActionResult Test() 
    { 
     return View(clients); 
    } 

    [HttpPost] 
    public ActionResult Salvar(FormCollection form) 
    { 
     var length = form.GetValues(form.AllKeys[0]).Length; 
     var obj = clients.ToDictionary(x => x.Id); 
     Client novo; 

     for (var j = 0; j < length-1; j++) 
     { 
      novo = new Client { Id = Convert.ToInt32(form.GetValues("id")[j]), 
           Name = form.GetValues("Name")[j], 
           Email = form.GetValues("Email")[j], 
           Valor = Convert.ToInt32(form.GetValues("Valor")[j]) }; 
      AtualizaCliente(novo); 
     } 

     return Redirect("/"); 
    } 

    [HttpPost] 
    public ActionResult Test(List<Client> clients) 
    { 

     clients.Name + " - " + clients.Email + " - " + clients.Valor); 

     for(int i = 0; i < clients.Count; i++) 
     { 
      System.Diagnostics.Debug.WriteLine(clients[i].Id + " - " + clients[i].Name + " - " + clients[i].Email + " - " + clients[i].Valor); 
     } 

     return Redirect("/"); 
    } 

Ausblick:

model List<WebApplication3.Models.Client> 
@using GridMvc.Html 

    @using (Html.BeginForm("Test", "Home", FormMethod.Post)){ 

    <div> 
     @Html.Grid(Model).Columns(columns => 
    { 
     columns.Add() 
     .Encoded(false) 
     .Sanitized(false) 
     .SetWidth("5%") 
     .RenderValueAs(c => Html.TextBox("Id", c.Id, new { @id = "Id", @readonly = "readonly", @class = "form-control input-sm"})) 
     .Titled("Client ID"); 
     columns.Add() 
     .Encoded(false) 
     .Sanitized(false) 
     .RenderValueAs(c => Html.TextBox("Name", c.Name, new { @id = "Name", @readonly= "readonly", @class= "form-control col-md-4 input-sm" })) 
     .Titled("Name") 
     .Filterable(true) 
     .Sortable(true); 
     columns.Add() 
     .Encoded(false) 
     .Sanitized(false) 
     .RenderValueAs(c => Html.TextBox("Email", c.Email, new { @id = "Email", @readonly = "readonly", @class = "form-control col-md-4 input-sm" })) 
     .Titled("Email"); 
     columns.Add() 
     .Encoded(false) 
     .Sanitized(false) 
     .SetWidth("10%") 
     .RenderValueAs(c => Html.TextBox("Valor", c.Valor, new { @id = "Valor", @class = "form-control col-md-2 input-sm" })) 
     .Titled("Valor").Filterable(true).Format("{0:c}"); 
    }).Sortable(true) 
    </div> 

    <div class="form-actions text-right pal"> 
     <button type="submit" class="btn btn-primary" name="Salvar" value="Salvar"> 
      Salvar Alterações 
     </button> 
    </div> 
    } 

Die andere Ansicht mit regulären t möglicht, das ist funktioniert:

@using (Html.BeginForm("Test", "Home", FormMethod.Post)) 
{ 
<table class="table"> 

    @for (int i = 0 ; i < Model.Count ; i++) 
    { 
     <tr> 
      <td> 
       @Html.HiddenFor(m => Model[i].Id) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => Model[i].Name) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => Model[i].Email) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => Model[i].Valor) 
      </td> 
     </tr> 
    } 
</table> 

<div class="form-actions text-right pal"> 
    <button type="submit" class="btn btn-primary" name="Salvar" value="Salvar"> 
     Salvar Alterações 
    </button> 
</div> 
} 

Grundsätzlich funktioniert es, wenn meine HttpPost-Salvar Aktion geht aber null zurückkehrt, wenn die Aktion Test ist.

Obs: Ich habe versucht, die Grid.Mvc Ansicht Quellcode (_Grid.cshtml) zu ersetzen foreach zu for, und es löste nicht mein Problem.

+1

Soll dies eine Frage über ASP.NET Core MVC sein (wenn ja, verwenden Sie die richtigen Tags) oder über ASP.NET Core MVC (MVC1 zu MVC5)? Entfernen Sie dann das asp.net-mvc6-Tag, da es kein mvc6 mehr gibt und es für eine zukünftige neue Version reserviert ist, basierend auf dem alten ASP.NET MVC-Framework – Tseng

Antwort

0

Weil Sie kein Modell für Ihre Ansicht haben. Fügen Sie etwas wie @model IList<Client> oben auf Ihrem Modell hinzu.

+0

Ich habe ein Modell, ich habe nur vergessen, dies an meinem Code zu zeigen. Es ist jetzt aktualisiert. –

Verwandte Themen