powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [MVC] редактирование коллекции
25 сообщений из 68, страница 1 из 3
[MVC] редактирование коллекции
    #38631353
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как в MVC можно отредактировать(добавить/удалить айтемы) коллекцию модели?
Вот есть такая модель - User, коллекцию Pages нужно отредактировать на форме
Код: c#
1.
2.
3.
4.
5.
6.
    public class User : IEntity<long>
    {
        ...
        public IList<Page> Pages { get; set; }
        ...
    }


и есть такой action в контроллере
Код: c#
1.
2.
3.
4.
5.
6.
7.
        [HttpPost]
        public ActionResult SaveOrUpdate(User userModel)
        {
            // И вот тут хочется получить уже заполненную коллекцию userModel.Pages
            User user = _userService.SaveOrUpdate(userModel);
            return RedirectToAction("Index");
        }




Сделал пока вот так
Драгэндропом перемещаю из #availablePages в #userPages
при сабмите формы #availablePages очищаю (чтобы post запросом не отправлялись)
вьюха
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 
@model User
...           
<td class="ui-droppable" id="userPages">
	тут список страниц пользователя
	@foreach (Page page in @Model.Pages)
	{
		<div class="ui-draggable">
			@page.Name
			<input type="hidden" name="page" value="@page.Id" />
		</div>
	}

</td>
<td class="ui-droppable" id="availablePages">
	тут список всех доступных страниц
	@foreach (Page page in @Model.AvailablePages)
	{
		<div class="ui-draggable">
			@page.Name
			<input type="hidden" name="page" value="@page.Id" />
		</div>
	}
</td>


и в контроллере такой код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
[HttpPost]
public ActionResult SaveOrUpdate(User userModel, FormCollection collection)
{
	// и тут идет преобразование collection["page"] в коллекцию страниц
        // и запись их в userModel.Pages
	User user = _userService.SaveOrUpdate(userModel);
	return RedirectToAction("Index");
}

...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631369
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631443
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss,

направление верное.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631532
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал такой вариант:
(перед сабмитом чищу #availablePages)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<td class="ui-droppable" id="userPages">
	@for (int i = 0; i < @Model.User.Pages.Count; i++)
	{
		<div class="ui-draggable">
			@Model.User.Pages[i].Name
			@Html.HiddenFor(x => x.User.Pages[i].Id)
		</div>
	}
</td>
<td class="ui-droppable" id="availablePages">
	@for (int i = 0; i < @Model.AvailablePages.Count; i++)
	{
		<div class="ui-draggable">
			@Model.AvailablePages[i].Name
			@Html.Hidden(string.Format("User.Pages[{0}].Id", @Model.User.Pages.Count + i), @Model.AvailablePages[i].Id)
		</div>
	}
</td>


но встала проблема - индексы у хидденов не могут быть через один
т.е. у меня содержимое #userPages может получиться такое:
Код: html
1.
2.
<input type="hidden" name="User.Pages[0].Id" />
<input type="hidden" name="User.Pages[2].Id" />


и тогда на сервер придет только одна первая page, как тогда быть? Самому перед сабмитом править индексы?
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631538
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratossно встала проблема - индексы у хидденов не могут быть через один
т.е. у меня содержимое #userPages может получиться такое:
Код: html
1.
2.
<input type="hidden" name="User.Pages[0].Id" />
<input type="hidden" name="User.Pages[2].Id" />



и тогда на сервер придет только одна первая page, как тогда быть? Самому перед сабмитом править индексы?

забудь про это гауно в виде индексов.

Код: html
1.
2.
3.
<input type="hidden" name="Pages" value="2" />
<input type="hidden" name="Pages" value="23" />
<input type="hidden" name="Pages" value="11" />



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class UserPagesModel
{
    public int[] Pages {get;set;}  
}

[Route("pages/{userId}"), HttpPost]
public ActionResult SaveOrUpdate(int userId, UserPagesModel model)
{
    var user = SomeService.GetUser(userId);
    if(user == null)
        return HttpNotFound();
    
     model.Pages // вот твои Pages в виде коллекции Id

}
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631539
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss,

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
<td class="ui-droppable" id="availablePages">
	@foreach (var page in Model.AvailablePages)
	{
		<div class="ui-draggable">
			@page.Name
                        <input type="hidden" name="Pages" value="@page.Id" />
		</div>
	}
</td>



и не слушай отдельных неадекватов, дающих "рецепты", которым даже на помойке стыдно находиться.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631607
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упоротый хвост вещает о целомудрии и верной архитектуре? Детский сад Он уже раз 10 успел обделаться по самые уши за последние несколько дней, тут грядёт тоже самое. Все тру дяди используют штатную индексацию без левых атрибутовых костылей над пост методами. Но некоторые утырки таки хотят заебать себя лапшекодом. Не будем им мешать.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631642
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мссущко,

Прекращай истерику. Индексация это гауно неюзабельное, адский костыль.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631646
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttМссущко,

Прекращай истерику. Индексация это гауно неюзабельное, адский костыль.
Истерики нет. Есть четкое понимание - лучше прозрачная индексация и нативные методы контроллеров, чем атрибутный хаос.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631652
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss(перед сабмитом чищу #availablePages)
проще этот контейнер за пределами формы держать - ничего чистить не придётся


maratossи тогда на сервер придет только одна первая page, как тогда быть? Самому перед сабмитом править индексы?
Штатная индексация
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    @foreach (var p in Model.Pages)
    {
            <div class="ui-draggable">
                <input type="hidden" name="Pages.Index" value="@p.Id" />
		<input type="hidden" name="Pages[@p.id].id" value="@p.Id" />
                @p.Name       
            </div>       
    }



и никаких педалей
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631660
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стараюсь всегда использовать хелперы, для данной задачи @Html.Hidden.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631671
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоhVosttМссущко,

Прекращай истерику. Индексация это гауно неюзабельное, адский костыль.
Истерики нет. Есть четкое понимание - лучше прозрачная индексация и нативные методы контроллеров, чем атрибутный хаос.

Если индекс идёт не по порядку, а это как раз случай автора, то коллекция не получается. Единственный способ как-то заставить работать с индексом это с помощью яваскрипта перед сабмитом мере индексировать поля. Более убогого решения придумать очень сложно. Так что на помойку это унылое гавно.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631720
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttмсущкопропущено...

Истерики нет. Есть четкое понимание - лучше прозрачная индексация и нативные методы контроллеров, чем атрибутный хаос.

Если индекс идёт не по порядку, а это как раз случай автора, то коллекция не получается. Единственный способ как-то заставить работать с индексом это с помощью яваскрипта перед сабмитом мере индексировать поля. Более убогого решения придумать очень сложно. Так что на помойку это унылое гавно.
Какой нафик порядок, он никому не нужен. Если нужно отследить, например, только измененные элементы, это делается так:
http://codearticles.ru/articles/2286
http://codearticles.ru/articles/2289
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631738
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоКакой нафик порядок, он никому не нужен. Если нужно отследить, например, только измененные элементы, это делается так:
http://codearticles.ru/articles/2286
http://codearticles.ru/articles/2289

ты по ходу вообще не одупляешься. что в предыдущих ветках автор говорит про одно, ты ему впариваешь что-то левое, что в этой ветке гонишь какую-то ахинею.

иди проспись, чувыдлра. бросай курить, вставай на лыжи. прекращай гнать.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631739
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли индекс идёт не по порядку, а это как раз случай автора, то коллекция не получается. Единственный способ как-то заставить работать с индексом это с помощью яваскрипта перед сабмитом мере индексировать поля. Более убогого решения придумать очень сложно. Так что на помойку это унылое гавно.
1) получается, причём со стандартным DefaultModelBinder
2) javascript не нужен

готовить правильно нужно
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631741
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttмсущкоКакой нафик порядок, он никому не нужен. Если нужно отследить, например, только измененные элементы, это делается так:
http://codearticles.ru/articles/2286
http://codearticles.ru/articles/2289

ты по ходу вообще не одупляешься. что в предыдущих ветках автор говорит про одно, ты ему впариваешь что-то левое, что в этой ветке гонишь какую-то ахинею.

иди проспись, чувыдлра. бросай курить, вставай на лыжи. прекращай гнать.
Чудик, ты внять можешь сформулировать свою ахинею? По пунктам. А то сало твоей башки порядком просолилось и не хочет думать.
Все телодвижения нужно делать на клиенте и подсовывать контроллеру. Что не ясно?
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631742
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CRUD готовится по такому же принципу
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631749
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил1) получается, причём со стандартным DefaultModelBinder

maratossно встала проблема - индексы у хидденов не могут быть через один
т.е. у меня содержимое #userPages может получиться такое:
Код: html
1.
2.
<input type="hidden" name="User.Pages[0].Id" />
<input type="hidden" name="User.Pages[2].Id" />



?
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631754
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttИзопропил1) получается, причём со стандартным DefaultModelBinder

maratossно встала проблема - индексы у хидденов не могут быть через один
т.е. у меня содержимое #userPages может получиться такое:
Код: html
1.
2.
<input type="hidden" name="User.Pages[0].Id" />
<input type="hidden" name="User.Pages[2].Id" />



?

Это бред. Индексы должны быть по-порядку, автор криво решает задачу.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631759
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоЭто бред. Индексы должны быть по-порядку, автор криво решает задачу.

тут они и не могут находиться по порядку, потому что набор инпутов в группу происходит на клиенте. единственный выход, если прям усраться как нужны индексы, это перед сабмитов надо будет пройтись по инпутам и "переиндексировать".

но факт в том, что индексы в данному случае нах не нужны.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631772
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снимите шоры
Индексы - это не обязательно - последовательные целые начиная с 0.
это один из двух вариантов

Это могут быть строки, но для этого байндер должен получить перечень индексов
Который собственно в примере и формируется:
Код: html
1.
 <input type="hidden" name="Pages.Index" value="@p.Id" />


Члены коллекции индексируются не последовательными целыми, а ключами
Код: html
1.
2.
<input type="hidden" name="Pages[@p.Id].Id" value="@p.Id" />
<input type="text" name="Pages[@p.Id].Name" value="@p.Name" />



Неверующие могут посмотреть реализацию DefaultModelBinder.cs (UpdateCollection, GetIndexes)
или ознакомиться с ответами http://stackoverflow.com/questions/14822615/how-does-mvc-4-list-model-binding-work
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631779
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttно факт в том, что индексы в данному случае нах не нужны.
А какие с ними сложности?
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631787
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоЭто бред. Индексы должны быть по-порядку
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ (Non-Sequential Indices)

обратите внимание на дату публикации
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631792
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилмсущкоЭто бред. Индексы должны быть по-порядку
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ (Non-Sequential Indices)
обратите внимание на дату публикации
Таки я не вижу проблем делать индексы по-порядку. Новые элементы, созданные на клиенте, добавлять с последующим индексом. Если что-то удалили, индексы не пересчитывать, т.к. всё и так отлично пойдет в контроллер. Проблема надумана, всё работает в штатном порядке.
...
Рейтинг: 0 / 0
[MVC] редактирование коллекции
    #38631797
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Хвост, я не совсем понял, что ты хотел - это не работает.

@using (Html.BeginForm())
{
    <table>
        @{
            int i = 0;
            foreach (var item in Model.Items)
            {
                <tr>
                    <td>
                        <input type="hidden" name="Items" value="@item.Id" />
                        <input type="text" name="Items" value="@item.Value" />
                    </td>
                </tr>

                i++;
            }
        }
    </table>
    <input type="submit" value="Сохранить" />
}





[Route("items"), HttpPost]
public ActionResult Index(MainModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}

return RedirectToAction("Index");
}

Или ты о чём?
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [MVC] редактирование коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]