it-swarm.com.de

Wie erhalte ich in MVC/Razor die Werte mehrerer Checkboxen und übergebe sie alle an den Controller?

Ich habe eine Ansicht mit einer Liste von Elementen eines Modells. Ich muss zu jeder Zeile ein Kontrollkästchen hinzufügen, den Benutzer mehrere Kontrollkästchen auswählen lassen und einen Bezeichner der ausgewählten Zeile an den Controller übergeben. Ich weiß, wie ein einzelner Wert über einen Aktionslink übergeben wird, aber ich bin nicht sicher, wie mehrere Werte über einen Aktionslink übergeben werden sollen oder wie "ausgewählt" wird, welche Zeilen ausgewählt wurden. Ich zeige einige meiner Code-Versuche unten. Kann mir jemand helfen, herauszufinden, warum ich die Werte aller Kontrollkästchen nicht an den Controller übergeben kann?

Hier ist meine Seite

Checkbox     App ID     Date     Name
   []          1        5/10     Bob
   []          2        5/10     Ted
   []          3        5/11     Alice

Der Benutzer muss die Zeilen 1 und 3 auswählen (zum Beispiel) und diese App-IDs an den Controller übergeben.

Ich fing an, verschiedene Ansätze aufzulisten, entschied mich jedoch, nur meinen aktuellen Versuch zu zeigen und herauszufinden, ob jemand aufzeigen kann, was ich falsch mache. Der Hauptunterschied, den ich zwischen Beispielen online und meinen sehe, besteht darin, dass meines eine PagedList verwendet und die Zeilen der Tabelle in einer foreach-Schleife erstellt.

Der Parameter ints ist leer, wenn er auf die Steuerung trifft. Wie bekomme ich die Werte aus den Kontrollkästchen? Ich habe diese Site für die Grundidee verwendet, alle Kontrollkästchen gleich zu benennen und eine ICollection über den Aktionslink zu übergeben: http://haacked.com/archive/2008/10/23/model-binding-to -a-list.aspx/

Aussicht:

@model PagedList.IPagedList<CarmelFinancialWeb.Models.ModelMerchantSummary>
<div class="block" style="width: 100%; float: left">
<p class="block-heading"> 
Merchant Application Report
</p>
<div class="table-holder">
    <table class="table" style="margin-bottom: 0px">
            <tbody>
                @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            <input type="checkbox" name="ints" value=item.ApplicationID />
                        </td>
                    <td>
                        @Html.ActionLink(item.ApplicationID.ToString(), "ViewApplication", new { ID = item.ApplicationID, edit = 1 }, new AjaxOptions { HttpMethod = "GET" })
                    </td>
                    <td>
                        @Convert.ToDateTime(item.ApplicationDate).ToString("M/d/yy")
                    </td>
                    <td>
                        @item.ApplicantName
                    </td>
        </tbody>
    </table>
</div>
</div>
@Html.ActionLink("Print Application", "PrintApplication", "CreateContract", new { @class = "btn btn-primary" })

Regler:

    [AuthorizeAdmin]
    public ActionResult PrintApplication(ICollection<int> ints, string ID)
    {
        Contracts_Create contract = new Contracts_Create();
        ModelApplication currentApplication = new ModelApplication();
        currentApplication.contract = new ModelContract();
        return File(contract.CreatePDF_PrintedApplication_English(currentApplication.contract.location, currentApplication.contract), "application/pdf");
    }

Edit: Dies wurde als Duplikat einer anderen Frage markiert. Die Frage war, ob nicht sequentielle Eingabenamen verwendet werden können. Mein Problem ist, dass ich Eingaben verwende, die nicht nicht sequentiell sind, aber es funktioniert immer noch nicht. Ich verstehe das Konzept, ich kann einfach nicht herausfinden, warum mein spezifischer Code nicht funktioniert. Ich habe viel Zeit darauf verwendet und kann keine Antwort auf meinen spezifischen Code finden. Vielen Dank!

10
boilers222

Versuchen Sie, ein ViewModel in Ihre Seite einzufügen, und verwenden Sie den Modellordner, um dasselbe Ansichtsmodell wieder in Ihrem Controller zu veröffentlichen

Modelle:

public class MerchantModel
{
    public int AppId { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

public class MerchantViewModel
{
    public List<MerchantModel> Merchants { get; set; }
}

Regler:

public class DefaultController : Controller
{
    // GET: Default
    public ActionResult Index()
    {
        var merchant1 = new MerchantModel
        {
            AppId = 1,
            Name = "Bob"
        };
        var merchant2 = new MerchantModel
        {
            AppId = 2,
            Name = "Ted"
        };
        var merchant3 = new MerchantModel
        {
            AppId = 3,
            Name = "Alice"
        };

        List<MerchantModel> list = new List<MerchantModel>();
        list.Add(merchant1);
        list.Add(merchant2);
        list.Add(merchant3);

        var model = new MerchantViewModel
        {
            Merchants = list
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MerchantViewModel model)
    {
        return View(model);
    }
}

Aussicht:

 @model TestCheckBoxes.Models.MerchantViewModel

    @{
        Layout = null;
    }

    <!DOCTYPE html>

    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <form action="/default/index" method="post">
            <table>
                @for (int i = 0; i < Model.Merchants.Count; i++)
                {
                    <tr>
                        <td>
                            @Html.CheckBoxFor(x => x.Merchants[i].IsSelected)
                        </td>
                        <td>
                            @Html.HiddenFor(x => x.Merchants[i].AppId)
                            @Model.Merchants[i].AppId
                        </td>
                        <td>
                            @Html.HiddenFor(x => x.Merchants[i].Name)
                            @Model.Merchants[i].Name
                        </td>
                    </tr>
                }
            </table>

            <button type="submit">Submit</button>
        </form>



    </div>
</body>
</html>

Zurück in Ihrer [HttpPost] -Methode in Ihrem Controller haben Sie eine Liste von MerchantModels mit dem bool-Wert entweder "true" oder "false". Auf diese Weise können Sie überprüfen, ob es wahr ist, und einfach die AppId von dort abholen.

8
Nick Young

Verwenden Sie foreach nicht in mvc, sondern wiederholen Sie die Verwendung von for und einer Indexvariablen.

Sie benötigen außerdem einen Bool, um den Auswahlstatus zu verfolgen.

Dieser Beispielcode funktioniert für mich:

public class AModel
{
    public List<AnotherModel> Items { get; set; }
}

public class AnotherModel
{
    public int ApplicationId { get;set; }
    public DateTime ApplicationDate { get; set; }
    public string ApplicantName { get; set; }
    public bool Selected { get; set; }
}

Page.cshtml

@using (Html.BeginForm("PostIndex", "Home", FormMethod.Post))
{
    <table class="table" style="margin-bottom: 0px">
        <tbody>
        @for (var i = 0; i < Model.Items.Count(); i++)
        {
            <tr>
                <td>
                    <label>@Html.CheckBoxFor(model => model.Items[i].Selected) @Html.DisplayFor(model => model.Items[i].ApplicantName)</label>
                </td>
                <td>
                    @Html.ActionLink(Model.Items[i].ApplicationId.ToString(), "ViewApplication", new {ID = Model.Items[i].ApplicationId, edit = 1}, new AjaxOptions {HttpMethod = "GET"})
                </td>
                <td>
                    @Html.DisplayFor(model => model.Items[i].ApplicationDate)
                </td>
                <td>
                    @Html.DisplayFor(model => model.Items[i].ApplicationId)
                </td>
            </tr>
        }
        </tbody>
    </table>
    <input type="submit"/>
}
8
C Bauer

@CBauer und @NickYoung hatten im Wesentlichen die Antwort. Die Schlüssel waren (1), um sicherzustellen, dass in meinen Kontrollkästchen die ID mit einer fortlaufenden Nummer in Klammern mit demselben Suffix geschrieben wurde, (2) anstelle eines Aktionslinks eine Senden-Schaltfläche verwendet wurde und (3) der Controller richtig geschrieben wurde, um die IDs zu akzeptieren aus den Checkboxen. Ich dachte, ich würde etwas von meinem Code posten, um Ihnen eine Vorstellung davon zu geben, was ich tun kann:

Ansicht (teilweise):

@model PagedList.IPagedList<CarmelFinancialWeb.Models.ModelMerchantSummary>

...

@{var i = 0;}
@foreach (var item in Model)
{
  var tmp = "[" + i + "].ints";
  <tr>
      <td>
          <input name="ints" type="checkbox" id="@tmp" class="chkclass" value="@item.ApplicationID" />
      </td>

...

<input id="Submit" type="submit" class="btn btn-primary" value="Print Application(s)" />

...

Regler:

[AuthorizeAdmin]
[HttpPost]
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page)
{

...

Danke an @CBauer und @NickYoung für Ihre Hilfe!

0
boilers222