Получить данные списка в представлении в контроллере
У меня есть представление, в котором я просмотрел частичный вид в цикле. Список и частичное представление привязаны к каждому элементу в списке. Я не получаю значение списка на контроллере после ввода значения.
Вот мой взгляд:
<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");}