Hoe een lijst/array van een weergave terug naar de controller te krijgen

Mijn ViewResult-controller:

    public ViewResult Controller(int id)
    {
        List dataList = dataAccess.getDataById(id);
        Results[] resultArray = new Results[dataList.Count];
        ViewBag.results= resultArray;
        return View(dataList);
    }

Mijn mening:

@model IEnumerable

@{
    Solution.Models.Results[] res= ViewBag.results;
}


@using (Html.BeginForm()) {
<table>
@{

    int i = 0;
    foreach (var item in Model) {
    <tr>
        <td>
            Snippet: @Html.DisplayFor(modelItem => item.text)
        </td>

    </tr>
    <tr>
        <td>
            Translation: @Html.EditorFor(modelItem => res[i].text)
        </td>
    </tr>
    i++;
    }
}
</table>

<input class="CRUD-buttons" type="submit" value="Send" />

}

Mijn controlleractieResultaat:

    [HttpPost]
    public ActionResult Controller(/*List dataList, */Results[] results)
    {
        ResultText = results[0].text; //NullReferenceException
    }

dataList en resultaten zijn leeg. Ik heb een aantal berichten gelezen over stackoverflow, maar kon geen oplossing vinden.

Ik nam al een kijkje op de volgende blog ( link ) maar de MVC 2-code. :(

0
Voer uw titels niet vooraf in met "C # MVC 3:". Dat is waar de tags voor zijn.
toegevoegd de auteur John Saunders, de bron

1 antwoord

Er zijn meerdere manieren om dit te doen. Wat u hier krijgt is dat om de parameter resultaten te ontvangen, de naam voor de gegenereerde bewerkingsbesturingselementen resultaten [0] moet zijn voor de eerste, resultaten [1] voor de tweede, etc zonder gaten in de indexen (dit komt door hoe DefaultModelBinder verwacht de velden met de naam te vinden wanneer het formulier is gepost).

Dus een onmiddellijke (hoewel niet erg goede) oplossing zou zijn om de naam correct te specificeren:

@Html.TextBox(string.Format("results[{0}]", i), res[i].text)

A much better solution would be to put the results into your model (better yet, in a ViewModel created specifically for this view). For example, first of all you create a class that encapsulates one piece of data and the corresponding result:

class ItemViewModel
{
    Solution.Models.Data TheData { get; set; }
    Solution.Models.Results TheResults { get; set; }
}

U stelt vervolgens een aantal van deze items als model voor uw mening:

@model IEnumerable

en voer vervolgens het bewerkingselement uit met

Translation: @Html.EditorFor(modelItem => modelItem.TheResults)

Ten slotte wijzigt u de postback-actie om een ​​array met ItemViewModel te accepteren:

[HttpPost] 
public ActionResult Controller(ItemViewModel[] results) 

General piece of advice: Try to avoid using EditorFor with objects that are not part of your view's model (for example, things you have passed through ViewBag or ViewData). If you do this, MVC will punish you.

1
toegevoegd