2017-09-10 2 views
1

Ich bin neu in ASP.NET MVC. Mein Problem ist - ich möchte eine Sammlung der Artikel "POST", so dass der Controller es verarbeiten kann. Mein Modell ist eine Sammlung von -Warum Liste von Checkbox-Auswahlen immer als null in ASP.NET MVC-5

public class CheckedRentalProperty 
{ 
    public bool IsSelected { get; set; } 
    public int Id { get; set; } 
    public String Address { get; set; } 
} 

Mein Controller wie folgt definiert ist -

public class RentalPropertiesController : Controller 
{ 
    public ActionResult Index() 
    { 
     List<CheckedRentalProperty> checkHsList = new List<CheckedRentalProperty>(); 
     // Fill the list 
     return View(checkHsList); 
    } 

    [HttpPost] 
    public ActionResult Save(IEnumerable<CheckedRentalProperty> checkHsList) 
    { 
     // why checkHsList is coming as null ?? 
    } 
} 

Und die Aussicht ist so -

@model IEnumerable<XXX.Models.CheckedRentalProperty> 

@using (Html.BeginForm("Save", "RentalProperties", FormMethod.Post)) 
{ 
    <div class="form-horizontal"> 
     <div class="form-group"> 
      <table class="table"> 
       <tr> 
        <th> 

        </th> 
        <th> 
         @Html.DisplayNameFor(model => model.Address) 
        </th> 

       </tr> 

       @foreach (var item in Model) 
       { 
        <tr> 
         <td>@Html.CheckBoxFor(modelItem => item.IsSelected)</td> 

         <td> 
          @Html.DisplayFor(modelItem => item.Address) 
         </td> 
        </tr> 
       } 
      </table> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

Meine Erwartungen war - wenn ich traf den "Save" -Taste, das Modell, das IEnumerable<CheckedRentalProperty> Element ist, wird an die Save() Aktion des Controllers übergeben. Ich finde jedoch, dass der übergebene Parameter die ganze Zeit "Null" ist. Was vermisse ich?

+0

Diese Frage ist kein Duplikat. Bitte lesen Sie Orel's Antwort und überprüfen Sie die Unterschiede – user1748546

+0

Es ist ein Duplikat. Lies es sorgfältig, weil es auch genau erklärt, warum dein Code nicht funktioniert und wie man ihn mit 'for' loop oder' EditorTemplate' löst (und 'Orel's Antwort wiederholt nur, was im Duplikat ist!) Und Orels Antwort enthält Unsinn wie _IEnumerable sind nicht zu freundlich _ was einfach nur falsch ist und es ist völlig unnötig, ein anderes Ansichtsmodell zu erstellen, um Ihr vorhandenes zu verschmelzen –

Antwort

0

Modelle, die nur IEnumerable sind, sind nicht so freundlich wie MVC-Modell.

Hier treten viele Probleme auf, aber MVC-Webformularbindungen benötigen Formularnamensanforderungen, die in folgendem Format gesendet werden: PropertyName[Index].Property Das ist in Ihrem Beispiel nicht der Fall.

Es ist eine gute Design-Praxis, ein Wrapping ViewModel zu erstellen, das die Eigenschaften enthält, die Sie für die angegebenen Controller + -Seiten benötigen.

Ansichtsmodell

public class RentalPropertiesViewModel 
{ 
    public List<CheckedRentalProperty> CheckedRentalProperties { get; set; } 
} 

Controller: Als nächstes wollen wir dieses Ansichtsmodell in unserem Controller verwenden.

public ActionResult Index() 
{ 
    var checkHsList = new List<CheckedRentalProperty>(); 
    checkHsList.Add(new CheckedRentalProperty { Id = 1, Address = "Address1", IsSelected = true }); 
    checkHsList.Add(new CheckedRentalProperty { Id = 2, Address = "Address2", IsSelected = false }); 
    checkHsList.Add(new CheckedRentalProperty { Id = 3, Address = "Address3", IsSelected = true }); 

    var model = new RentalPropertiesViewModel 
    { 
     CheckedRentalProperties = checkHsList 
    }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult Save(RentalPropertiesViewModel model) 
{ 
    // why checkHsList is coming as null ?? 

    return null; 
} 

Ausblick: Jetzt in unserer Sicht haben wir das Modell als neue Ansichtsmodell Typ festgelegt sollten wir geschaffen.

@model TestBindings.Models.RentalPropertiesViewModel 

Und unserer Ansicht nach Form sollte so etwas wie sein:

<table class="table"> 
    <tr> 
     <th> 
      Is Selected 
     </th> 
     <th> 
      Address 
     </th> 

    </tr> 
    @for (int i = 0; i < Model.CheckedRentalProperties.Count(); i++) 
    { 
     <tr> 
      @Html.HiddenFor(model => model.CheckedRentalProperties[i].Id); 
      <td>@Html.CheckBoxFor(model => model.CheckedRentalProperties[i].IsSelected)</td> 

      <td>@Html.TextBoxFor(model => model.CheckedRentalProperties[i].Address)</td> 
     </tr> 
    } 
</table> 

habe ich model => model.CheckedRentalProperties[i].IsSelected das folgende Format verwenden und jetzt MVC InputExtensions wird es richtig binden. z:CheckedRentalProperties[0].IsSelected

Wichtiger Hinweis: Hinweis i Id Eigenschaft als versteckte ich vorbei, so MVC Binder wissen die Id auf den richtigen Punkt zu setzen.

+0

Vielen Dank, Orel. Es klappt. – user1748546