it-swarm.com.de

Wie wird die IEnumerable-Liste einschließlich des Kontrollkästchenstatus an den Controller in MVC übergeben?

Ich habe eine MVC-Anwendung, in der ich ein Modell wie dieses verwende:

 public class BlockedIPViewModel
{
    public string  IP { get; set; }
    public int ID { get; set; }
    public bool Checked { get; set; }
}

Jetzt habe ich eine Ansicht, um eine Liste wie diese zu binden:

@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel>
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()
}

@foreach (var item in Model) {
<tr>
    <td>

        @Html.HiddenFor(x => item.IP)           
        @Html.CheckBoxFor(x => item.Checked)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.IP)
    </td>

</tr>
}

<div>
    <input type="submit" value="Unblock IPs" />
</div>

Jetzt habe ich einen Controller, der die Aktion über die Schaltfläche "Senden" empfängt:

 public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs)
 {

  }

Ich erhalte jedoch einen Nullwert für lstBlockedIPs, wenn ich zur Controller-Aktion komme. Ich muss hier den Status des Kontrollkästchens abrufen. Bitte helfen Sie.

47
Praveen VR

Verwenden Sie stattdessen eine Liste und ersetzen Sie Ihre foreach -Schleife durch eine for -Schleife:

@model IList<BlockedIPViewModel>

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken()

    @for (var i = 0; i < Model.Count; i++) 
    {
        <tr>
            <td>
                @Html.HiddenFor(x => x[i].IP)           
                @Html.CheckBoxFor(x => x[i].Checked)
            </td>
            <td>
                @Html.DisplayFor(x => x[i].IP)
            </td>
        </tr>
    }
    <div>
        <input type="submit" value="Unblock IPs" />
    </div>
}

Alternativ können Sie eine Editorvorlage verwenden:

@model IEnumerable<BlockedIPViewModel>

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken()
    @Html.EditorForModel()   
    <div>
        <input type="submit" value="Unblock IPs" />
    </div>
}

und dann definieren Sie die Vorlage ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml, das automatisch für jedes Element der Sammlung gerendert wird:

@model BlockedIPViewModel
<tr>
    <td>
        @Html.HiddenFor(x => x.IP)
        @Html.CheckBoxFor(x => x.Checked)
    </td>
    <td>
        @Html.DisplayFor(x => x.IP)
    </td>
</tr>

Der Grund dafür, dass Sie in Ihrem Controller den Wert null erhalten haben, liegt darin, dass Sie die Namenskonvention für Ihre Eingabefelder, die der Standardmodellordner für eine erfolgreiche Bindung an eine Liste erwartet, nicht beachtet haben. Ich lade Sie ein, die following article .

Nachdem Sie es gelesen haben, sehen Sie sich das generierte HTML (und insbesondere die Namen der Eingabefelder) mit meinem und Ihrem Beispiel an. Dann vergleichen Sie und Sie werden verstehen, warum Ihre nicht funktioniert.

91
Darin Dimitrov