Как передать один элемент из списка в контроллер - PullRequest
0 голосов
/ 20 октября 2019

У меня есть список объектов в моей 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">&times;</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 текущими значениями.

Итак, есть ли решение передать список с одним элементом? Или как я могу сделать это лучше?

1 Ответ

0 голосов
/ 21 октября 2019

Если вы хотите отредактировать только один элемент, вы должны передать только 1 элемент (если это возможно)

Для начала нужно изменить сигнатуру вашей функции для обработки одной модели сервиса:

[Authorize(Roles = "Business")]
public ActionResult EditService(ServiceViewModel model)

Теперь, чтобы это работало, вам нужно убедиться, что вы передали правильные данные в форму. Кажется, что ваши данные формы и ваша модель совпадают, и это будет работать. Если нет, пожалуйста, дайте мне знать.

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