Динамический список ASP.Net Core Razor Pages - PullRequest
0 голосов
/ 06 мая 2018

Я хочу создать веб-сайт со страницами Razor, чтобы сохранить пространство и соответствующие комнаты. Итак, в моей модели пространство имеет список комнат.

public class Space
{
    public int Id { get; set; }
    public string SpaceName { get; set; }
    public List<Room> Rooms { get; set; }

    public Space()
    {
        this.Rooms = new List<Room>();
    }
}

В create.cshtml я хочу динамически добавлять и удалять комнаты

<h1>Create New Space</h1>
<form method="post">
    <div class="form-group">
       <label for="Space.SpaceName">Space Name</label>
       <input type="text" class="form-control" asp-for="Space.SpaceName" placeholder="Enter space name">
       <span asp-validation-for="Space.SpaceName" ></span>
    </div>
    @if(Model.Space != null){
        for (int i = 0; i < Model.Space.Rooms.Count; i++)
        {
         <input asp-for="@i" type="hidden" />
         <div class="form-group">
             <label for="SpaceName">Room Name</label>
             <input type="text" class="form-control" asp-for="Space.Rooms[i].Name" placeholder="Enter space name">
             <span asp-validation-for="Space.Rooms[i].Name" ></span>
         </div>

         <button type="submit" asp-page-handler="removeroom" asp-route-index="@i">Remove Room</button>
         }
    }

    <button type="submit" asp-page-handler="addroom">Add Room</button>

    <button type="submit" asp-page-handler="submit" class="btn btn-primary">Submit</button>
</form>

PageModel выглядит так:

public class CreateModel : PageModel
{
    readonly SpaceRepository spaceRepository;

    public CreateModel(SpaceRepository spaceRepository)
    {
        this.spaceRepository = spaceRepository;
    }

    [BindProperty]
    public Space Space { get; set; }

    public async Task<IActionResult> OnPostSubmitAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        spaceRepository.Create(Space);
        return RedirectToPage("./Index");
    }

    public async Task OnPostAddRoomAsync()
    {
        Space.Rooms.Add(new Room());
    }

    public async Task OnPostRemoveRoomAsync(int index)
    {
        Space.Rooms.RemoveAt(index);
    }
}

Пока все работает как положено, но когда я создаю, например, 3 комнаты и удаляю первую или вторую, всегда удаляется последняя.

Кажется, что страница не получает манипулируемый список после сообщения обработчика.

Есть идеи, чего не хватает?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Индексы ДОЛЖНЫ быть в последовательном порядке без пробелов. Если у вас есть массив или список, подобный этому:

rooms[0] = "Room 1"
rooms[1] = "Room 2"
rooms[2] = "Room 3"

Будет опубликовано правильно. Но тогда, если вы удалите rooms[1], он будет только публиковать rooms[0] и пропустить rooms[2].

Это решается с использованием GUID в качестве индексов, как BeginCollectionItem или EditorForMany со скрытым индексом GUID отслеживают это в правильном последовательном порядке.

0 голосов
/ 05 сентября 2018

Я знаю, что вам, вероятно, это больше не нужно, но у меня тоже была проблема с этим, поэтому я открыл проблему на github и получил ответ на ваш вопрос: https://github.com/aspnet/Mvc/issues/8373
Таким образом, в основном MVC является моделью кругового отключения, поэтому поля могут оставаться заполненными. Из-за этого модель страницы использует последнее известное состояние модели для заполнения каждого поля. Вы можете исправить это, используя Modelstate.Clear() после удаления вашего элемента. Благодаря этому вы также не будете показывать никаких проверочных сообщений после простого удаления элемента из списка.

...