Получить данные списка в представлении в контроллере

У меня есть представление, в котором я просмотрел частичный вид в цикле. Список и частичное представление привязаны к каждому элементу в списке. Я не получаю значение списка на контроллере после ввода значения.

Вот мой взгляд:

<table id="resourceRequirement" class="table" width="100%" border="0">
    <thead>
        <tr style="background-color:#dfdfdf;">
            <td><div align="center">PRIORITY</div></td>
            <td><div align="center">SYSTEM RESOURCE / COMPONENT</div></td>
            <td><div align="center">RECOVERY TIME OBJECTIVE</div></td>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.ResourceRequirement)
        {
            @Html.Partial("~/Views/Shared/_ResourceRequirement.cshtml", item)
        }
    </tbody>
</table>

Вот мой частичный вид:

@model DisasterManagementSystem.Models.BusinessImpactAnalysis.ResourceRequirement
<tr>
    <td>
        @Html.TextBoxFor(m => m.priority)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.priority)
        </div>
    </td>
    <td>
        @Html.TextBoxFor(m => m.systemresource)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.systemresource)
        </div>
    </td>
    <td>
        @Html.TextBoxFor(m => m.receveryTime)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.receveryTime)
        </div>
    </td>
</tr>

Вот мой список:

public List<ResourceRequirement> ResourceRequirement { get; set; }

И класс здесь:

public class ResourceRequirement
{
    [Required(ErrorMessage = "*")]
    public string priority { get; set; }

    [Required(ErrorMessage = "*")]
    public string systemresource { get; set; }

    [Required(ErrorMessage = "*")]
    public string receveryTime { get; set; }
}

Пожалуйста, сообщите, когда я пытаюсь получить список из модели на почте. Я получаю список как null.

Ответ 1

Вы используете цикл foreach, а частичный - генерирует повторяющиеся атрибуты name без индексаторов (поэтому не может связываться с коллекцией) и дублировать атрибуты id (недопустимый html).

Вместо частичного представления используйте EditorTemplate. Переименуйте текущий частичный вид на ResourceRequirement.cshtml (то есть, чтобы соответствовать имени класса) и поместите его в папку /Views/Shared/EditorTemplates (или в папку /Views/yourController/EditorTemplates)

Затем в главном представлении удалите цикл foreach и замените его на

<tbody>
    @Html.EditorFor(m => m.ResourceRequirement)
</tbody>

Метод EditorFor() принимает IEnumerable<T> и генерирует правильный html для каждого элемента в вашей коллекции. Если вы проверите html, вы увидите правильные атрибуты имени в элементах формы.

<input type="text" name="ResourceRequirement[0].priority" .... />
<input type="text" name="ResourceRequirement[1].priority" .... />
<input type="text" name="ResourceRequirement[2].priority" .... />

и т.д.. который будет привязан к вашей модели при отправке формы (сравните ее с тем, что вы сейчас генерируете)

Ответ 2

Как вы хотите, чтобы список передавался в представлении только в контроллере, передайте List с помощью метода типа

public Actionresult List()
{
  var search = from m in db.resourcerequirement select m;
  return PartialView("_List",search.tolist());
}

После этого в частичном представлении _List

@model DisasterManagementSystem.Models.BusinessImpactAnalysis.ResourceRequirement
<tr>
    <td>
        @Html.TextBoxFor(m => m.priority)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.priority)
        </div>
    </td>
    <td>
        @Html.TextBoxFor(m => m.systemresource)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.systemresource)
        </div>
    </td>
    <td>
        @Html.TextBoxFor(m => m.receveryTime)<br />
        <div style="color:red;">
            @Html.ValidationMessageFor(model => model.receveryTime)
        </div>
    </td>
</tr>

Показать частичный вид

@{Html.RenderAction("List", "ControllerName");}