У меня есть список объектов в моей viewModel, например:
public class BusinessServicesViewModel
{
public List<ServiceViewModel> Services { get; set; }
public ServiceViewModel NewService { get; set; }
}
Я хочу редактировать отдельный элемент из этого списка в представлении:
@for (i = 0; i < Model.Services.Count; i++)
{
<div class="modal fade" id="editServiceModal_@i" tabindex="-1" role="dialog" aria-labelledby="editServiceModal_@i" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="editServiceLabel_@i">Edytuj usługę @Model.Services[i].Name</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
@using (Html.BeginForm("EditService", "BusinessSite"))
{
<div class="modal-body">
<div>
@Html.LabelFor(m => m.Services[i].Name)
@Html.TextBoxFor(m => m.Services[i].Name, new { @class = "form-control" })
</div>
<div>
@Html.LabelFor(m => m.Services[i].Duration)
@Html.TextBoxFor(m => m.Services[i].Duration, new { @class = "form-control", type = "number", min = "1", max = "1440" })
</div>
@Html.HiddenFor(m => m.Services[i].Id)
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Zamknij</button>
<input type="submit" class="btn btn-warning" value="Zapisz" />
</div>
}
</div>
</div>
</div>
В контроллере я сделалэто так:
[Authorize(Roles = "Business")]
public ActionResult EditService(BusinessServicesViewModel model)
{
var userId = HttpContext.User.Identity.GetUserId();
BusinessServicesViewModel modelToReturn;
if (!ModelState.IsValid)
{
modelToReturn = GetBusinessServicesViewModel(userId);
modelToReturn.NewService = model.NewService;
return View("Services", modelToReturn);
}
var user = _contex.Users.Include(u => u.Business.Services).Single(u => u.Id == userId);
var service = user.Business.Services.SingleOrDefault(s => s.Id == model.Services[0].Id);
service.Duration = model.Services[0].Duration;
service.Name = model.Services[0].Name;
if (_contex.SaveChanges() > 0)
[...]
}
Для первого элемента из списка это работает. Контроллер получает список с одним элементом. Я думал, что представление всегда проходит список только с одним элементом, который находится в форме. Вот почему я написал что-то вроде этого: service.Duration = model.Services[0].Duration;
Но для других элементов контроллер получает нулевой список. Похоже, он хочет передать элемент с индексом, например, 3, но предыдущие индексы не существуют, поэтому он в целом равен нулю.
Я не хочу передавать список со всеми элементами, потому что он довольно большойЯ хочу передать только один элемент. Также я хотел бы использовать этот список и @Html.TextBoxFor
, потому что он приятно заполняет textBox текущими значениями.
Итак, есть ли решение передать список с одним элементом? Или как я могу сделать это лучше?