Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [MVC] редактирование коллекции / 25 сообщений из 68, страница 1 из 3
02.05.2014, 13:31
    #38631353
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Подскажите как в 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
02.05.2014, 14:01
    #38631369
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
...
Рейтинг: 0 / 0
02.05.2014, 16:34
    #38631443
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
maratoss,

направление верное.
...
Рейтинг: 0 / 0
02.05.2014, 19:32
    #38631532
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Попробовал такой вариант:
(перед сабмитом чищу #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
02.05.2014, 19:40
    #38631538
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
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
02.05.2014, 19:44
    #38631539
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
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
02.05.2014, 22:04
    #38631607
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Упоротый хвост вещает о целомудрии и верной архитектуре? Детский сад Он уже раз 10 успел обделаться по самые уши за последние несколько дней, тут грядёт тоже самое. Все тру дяди используют штатную индексацию без левых атрибутовых костылей над пост методами. Но некоторые утырки таки хотят заебать себя лапшекодом. Не будем им мешать.
...
Рейтинг: 0 / 0
02.05.2014, 23:46
    #38631642
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Мссущко,

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

Прекращай истерику. Индексация это гауно неюзабельное, адский костыль.
Истерики нет. Есть четкое понимание - лучше прозрачная индексация и нативные методы контроллеров, чем атрибутный хаос.
...
Рейтинг: 0 / 0
03.05.2014, 00:21
    #38631652
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
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
03.05.2014, 00:56
    #38631660
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Стараюсь всегда использовать хелперы, для данной задачи @Html.Hidden.
...
Рейтинг: 0 / 0
03.05.2014, 01:52
    #38631671
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
мсущкоhVosttМссущко,

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

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

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

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

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

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

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

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

иди проспись, чувыдлра. бросай курить, вставай на лыжи. прекращай гнать.
Чудик, ты внять можешь сформулировать свою ахинею? По пунктам. А то сало твоей башки порядком просолилось и не хочет думать.
Все телодвижения нужно делать на клиенте и подсовывать контроллеру. Что не ясно?
...
Рейтинг: 0 / 0
03.05.2014, 10:46
    #38631742
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
CRUD готовится по такому же принципу
...
Рейтинг: 0 / 0
03.05.2014, 11:02
    #38631749
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Изопропил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
03.05.2014, 11:06
    #38631754
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
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
03.05.2014, 11:19
    #38631759
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
мсущкоЭто бред. Индексы должны быть по-порядку, автор криво решает задачу.

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

но факт в том, что индексы в данному случае нах не нужны.
...
Рейтинг: 0 / 0
03.05.2014, 11:39
    #38631772
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Снимите шоры
Индексы - это не обязательно - последовательные целые начиная с 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
03.05.2014, 12:01
    #38631779
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
hVosttно факт в том, что индексы в данному случае нах не нужны.
А какие с ними сложности?
...
Рейтинг: 0 / 0
03.05.2014, 12:18
    #38631787
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
мсущкоЭто бред. Индексы должны быть по-порядку
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ (Non-Sequential Indices)

обратите внимание на дату публикации
...
Рейтинг: 0 / 0
03.05.2014, 12:24
    #38631792
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
ИзопропилмсущкоЭто бред. Индексы должны быть по-порядку
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ (Non-Sequential Indices)
обратите внимание на дату публикации
Таки я не вижу проблем делать индексы по-порядку. Новые элементы, созданные на клиенте, добавлять с последующим индексом. Если что-то удалили, индексы не пересчитывать, т.к. всё и так отлично пойдет в контроллер. Проблема надумана, всё работает в штатном порядке.
...
Рейтинг: 0 / 0
03.05.2014, 12:32
    #38631797
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[MVC] редактирование коллекции
Код: 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
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [MVC] редактирование коллекции / 25 сообщений из 68, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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