Как получить список / массив из представления обратно в контроллер - PullRequest
0 голосов
/ 07 декабря 2011

Мой контроллер ViewResult:

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

My View:

@model IEnumerable<Solution.Models.Data>

@{
    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>
<p>
    <input class="CRUD-buttons" type="submit" value="Send" />
</p>
}

Мой контроллер ActionResult:

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

dataList и результаты пусты. Я прочитал пару сообщений о stackoverflow, но не смог найти решение.

Я уже заглянул в следующий блог ( ссылка ), но его код MVC 2. (

1 Ответ

1 голос
/ 07 декабря 2011

Есть несколько способов сделать это.Что вас здесь привлекает, так это то, что для получения параметра results значение name для сгенерированных элементов управления для редактирования должно быть results[0] для первого, results[1] для второго и т. Д. Без пробелов в индексах(это из-за , как DefaultModelBinder ожидает найти поля с именем при публикации формы).

Таким образом, одним из немедленных (хотя и не очень хороших) решений было бы указать имяправильно:

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

Гораздо лучшим решением было бы поместить results в вашу модель (еще лучше, в ViewModel, созданной специально для этого представления).Например, сначала вы создаете класс, который инкапсулирует один фрагмент данных и соответствующий результат:

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

Затем вы создаете в своем представлении коллекцию этих элементов в качестве модели:

@model IEnumerable<ItemViewModel>

и затем выведите элемент управления для редактирования с помощью

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

Наконец, вы изменяете действие обратной передачи, чтобы принять массив ItemViewModel:

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

General pieceСовет: Старайтесь избегать использования EditorFor с объектами, которые не являются частью модели вашего представления (например, вещи, которые вы прошли через ViewBag или ViewData).Если вы сделаете это, MVC накажет вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...