Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

Теряются данные при передаче в контроллер

28.03.2021, 16:13. Показов 5533. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Столкнулся вот с какой проблемкой. По какой-то причине теряется подчиненная коллекция у объекта.
Т.е. объект, у него есть "подчиненные объекты" (связь многие ко многим). При передаче из контроллера в представления эти данные передаются, а вот обратно, когда POST-запросом обратно возвращаются в контроллер, то по какой-то причине этих данных нет . В представлении
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2021, 16:13
Ответы с готовыми решениями:

Обрезается значение при передаче в контроллер
Доброго времени суток,есть два метода в контроллере, которые принимают string id. public ActionResult Delete(string id) { ...

Теряются байты при передаче по RS485
В общем, в чем идея. Комп шлет контроллеру пакет из 5ти байт, контроллер отвечает компу пакетом также из 5ти байт. Когда я соединяю их...

Теряются байты при передаче массива структур клиенту
Здравствуйте. Сервер подаёт на клиент массив структур. размер структуры 148байт. т.е всего 4400байт Получаю данные чз BeginReceive....

17
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.03.2021, 16:48
При обратной привязке (от клиента контролеру), если параметром метода контролера указан класс, то MVC создает экземпляр этого класса и делает сопоставление скалярных полей класса с параметрами Http.
Если нужно передать что-то "внутреннее", то либо JSON (если много), либо в параметрах метода контроллера следует указать "потроха" как обычные скаляры, а в его коде вложить их в класс самостоятельно
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.03.2021, 18:22  [ТС]
MsGuns, объясню ситуацию (в продолжение вот этой темы Тэги к статьям, или организация ралевантного контента)
Я что-то не могу корректно настроить работу с тегами. Как при изменении материала, проверять теги, т.е. какие добавили новые, какие удалили и т.п.

Добавлено через 24 минуты
У меня ошибка такая вылетает, когда пытаюсь редактировать статью:
Attaching an entity of type 'Models.Article' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.03.2021, 19:42
Прочитал еще раз Вашу ссылку. Если по сути, то понял так.
Есть две сущности: Master и Detail. Отношение один-ко-многим.
Есть ситуация, когда добавляется новая сущность Detail к имеющейся сущности Master,
и есть ситуация, когда уже имеющаяся сущность Detail имеющейся сущности Master просто изменяется.

В первом случае нужен Insert, во втором Update.
Проблема в том, как распознать из полученной от клиента посылки первое это или второе.

Я правильно понял суть ?

Добавлено через 23 минуты
Теперь немного внести ясности в терминологию
В частности, имеется в виду слово "тэг" (англ. "Tag")

То, что в быту под этим словом понимается "бирка", например, для собаки или покойника в морге , "ярлык"-брендовая наклейка на бензобаке байка, "этикетка" на бутылке, "болтающийся конец", за который можно дергать, например, марионетку", и т.д.) в программировании понимается совсем иное.
В HTML под этим словом понимается как некий объект вообще (link, script, style), так и элемент DOM, видимый или не видимый в окне браузера. "Тэг" здесь явно используется как объект, с которым можно взаимодействовать посредством JS либо внутренних ссылках одних объектов на другие.

В издательском деле (в котором я дилетант из дилетантов) тоже используются "тэги", смысл которых для меня вроде кубических коней в вакууме. Ясно только, что это некоторые "идентификаторы", которые указывают на какие-то куски чего-то внутри тоже чего-то

Что такое "тэги" в СУБД, для меня вообще полная абстракция Полагаю, что для "нативности" разработчик решил некоторую сущность предметной области (например "тема" или "ключевое слово/фраза") обозвать именно так.
Но как эта таинственная сущность укладывается в общую модель (схему) БД ? Из Вашего кода в ссылке ясности не наступило. Для меня, по крайней мере. Вдобавок у меня чувство, что Вы использовали Code First, который как китайская грамота - смотрю книгу, а вижу фигу

Нужны Ваши пояснения
Если, конечно, не затруднит.

Добавлено через 20 минут
Попробую немного повоображать (люблю я это дело)

Есть веб-сайт, который представляет клиенту (браузеру) некую страничку с неким интерфейсным функционалом.
На страничке есть контент в виде статей или абзацев, каждый из которых представлен собственным блоком текста.
Пользователь имеет возможность:
1) Вносить изменения в любой блок
2) Добавлять новый блок и наполнять его текстом, картинками и т.д.
3) Удалять целиком весь блок.

Важно как организована на Клиенте имплементация функционала.
Тут есть 2 варианта (есть и третий, но не будет о нем пока):
1) Обмен с сервером поблочный, т.е. действие (удалить-добавить-схранить) воспринимается только к одному блоку.
Если юзер меняет 3 блока, добавляет 2 и удаляет 4, то он должен условно "нажать на кнопку" 3+2+4 = 9 раз.
2) Обмен с сервером по общей команде. Т.е. после того, как юзер сделал то же самое, что в 1), на кнопку жмется один раз - и на сервер летит уже не посылочка, а целая "тележка".

Если для случая 1) все предельно ясно и решается тремя урлами и, соответственно, тремя методами контроллера, то для случая 2) все запутаннее., т.к. необходимо как-то запихать всю эту "тележку" в одну "посылку" и как-то еще и промаркировать каждую посылку на предмет "удалить-добавить-изменить".

Как реализовано у Вас ?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.03.2021, 20:27  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Я правильно понял суть ?
Нет, не совсем
Цитата Сообщение от MsGuns Посмотреть сообщение
Теперь немного внести ясности в терминологию
Согласен, виноват что излагаю слишком кратко и абстрактно, с этим нужно что-то делать ))))
Цитата Сообщение от MsGuns Посмотреть сообщение
Нужны Ваши пояснения
Если, конечно, не затруднит.
Как реализовано у Вас ?
Конечно, сейчас объясню.
Хочу запилить на сайте систему ярлыков, чтобы была возможность выборки похожих(релевантных) материалов. Т.к. строковое представление (и хранение) не совсем хотелось бы (а его похоже не избежать, блин, пока пишу это, в голову лезет JSON), решил хранение ярлыков выделить в отдельную таблицу в БД и соединить с таблицей статей через связь многие-ко-многим (в бд также появилась промежуточная таблица). Почему я так сделал? Мне показалось удобно - по ярлыку можно получить все статьи, в которых он используется.
Цитата Сообщение от MsGuns Посмотреть сообщение
Важно как организована на Клиенте имплементация функционала.
В контроллере проверяется строка и ее содержимое (ярлыки перечислены через ','), вот таким образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void updateTags(Article article)
        {
            if (!string.IsNullOrWhiteSpace(article.TagsString))
            {
                var tagsArray = article.TagsString.Split(',').Select(ss => ss.Trim());
 
                var tags = GetTagsByArticleId(article.Id);
 
                foreach (var item in tagsArray)
                {
                    var tag = getTagByTitle(item);
 
                    if (!tags.Contains(tag))
                    {
                        if (tag.Id == 0)
                        {
                            tag.Articles.Add(article);
                            Tags.Add(tag);
                            Entry(tag).State = EntityState.Added;
                        }
                        tag.Articles.Add(article);
                        Entry(tag).State = EntityState.Modified;
                    }
                }
            }           
        }
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.03.2021, 21:22
Важно как организована на Клиенте имплементация функционала.

Добавлено через 51 секунду
Нужна разметка (Представление) + JS
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.03.2021, 21:31  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
как организована на Клиенте имплементация функционала
вот в таком виде:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@using (Html.BeginForm())
{
    <div class="form-group row">
 
        @Html.LabelFor(model => model.Caption, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.TextBoxFor(model => model.Caption, new { @class = "form-control bg-dark" })
            @Html.ValidationMessageFor(model => model.Caption)
        </div>
        @Html.LabelFor(model => model.Catalog, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.DropDownListFor(model => model.CatalogId, new SelectList(ViewBag.Catalogs, "Id", "Caption"), "Каталог....", new { @class = "form-control bg-dark" })
        </div>
    </div>
 
 
    <div class="form-group row">
        @Html.LabelFor(model => model.Keyword, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.TextBoxFor(model => model.Keyword, new { @class = "form-control bg-dark" })
        </div>
        @Html.LabelFor(model => model.PublicationDate, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-2">
            @Html.EditorFor(model => model.PublicationDate)
        </div>
        
        @Html.LabelFor(model => model.Published, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-2">
            @Html.CheckBoxFor(model => model.Published)
        </div>
    </div>
 
 
    <div class="form-group row">
        @Html.LabelFor(model => model.AliasUrl, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.TextBoxFor(model => model.AliasUrl, new { @class = "form-control bg-dark" })
            @Html.ValidationMessageFor(model => model.AliasUrl)
        </div>
        @Html.LabelFor(model => model.LastModifed, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.EditorFor(model => model.LastModifed)
        </div>
    </div>
 
 
    <div class="form-group row">
        @Html.LabelFor(model => model.Description, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.TextAreaFor(model => model.Description, new { @class = "form-control bg-dark", @rows = "4" })
        </div>
        @Html.LabelFor(model => model.TagsString, new { @class = "col-sm-1 col-form-label" })
        <div class="col-sm-4">
            @Html.TextAreaFor(model => model.TagsString, new { @class = "form-control bg-dark", @rows = "4" })
        </div>
    </div>
 
 
    <div class="form-group">
        @Html.TextAreaFor(model => model.BodyArticle, new { @id = "richtext", @rows = "160" })
    </div>
 
 
    <div class="form-group" style="display: inline-block">
        <input type="submit" value="Сохранить" class="btn btn-warning" />
    </div>
    <div style="display:inline-block">
        <input type="button" name="cancel" class="btn btn-dark" value="Cancel" />
    </div>
}
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.03.2021, 23:02
У Вас даже не "тележка", а целый "вагон". Не мудрено, что на сервере приходится разбирать все это нагромождение чемоданов

ИМХО, "Клиент" у Вас явно перегружен, нужно делать проще и управляемее. Почему-то Вы не используете JS, - здесь он явно был бы по делу. Почему бы Вам не использовать вместо одного толстого запроса несколько тонких, по контексту ? Ну и зачем перегрузка всей страницы, почему не асинхроны ? Извините, но этот Ваш код - "ф топку !"

Увлекаемся шаблонами ? Ну-ну

Добавлено через 8 минут
В Ваше странице несколько блоков с группами контролов, они все связаны с одной сущностью БД ? Сдается мне, что нет.
Опять же есть несколько Textarea для обширных текстов. Тут явно напрашивается комбинация параметров и JSON. Ну и асинхрон, конечно

Добавлено через 10 минут
Но чтобы разобраться полностью, нужен макет страницы. А еще лучше не рэйзоровское "художество", а разметка, приходящая на Клиент.

Честно говоря, я уже давно избегаю всех этих @Html.xxx, кроме @Html.Action и @Ajax.ActionLink - "многа букав" и неожиданности в итоге. Мне проще выражаться на языке разметки
Ну и, конечно, JS, куда ж без него.

По поводу бутстрапа (а также прочих вью и реактов). Дело, конечно, личное - "..каждый имеет право" (М.А. Булгаков "Собачье сердце"). Все хорошо для новичков и ленивых, не надо разбираться в стилях, адаптивность и отзывчивость, и все такое.. Но как же все это загрязняет код !

Два последних абзаца - сугубо личное. Так, выход эмоций. Можете проигнорить
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
29.03.2021, 07:24  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Почему-то Вы не используете JS, - здесь он явно был бы по делу.
По простой причине - я его не изучал , так, чисто поверхностно, бесит меня утиная типизация
Цитата Сообщение от MsGuns Посмотреть сообщение
Извините, но этот Ваш код - "ф топку !"
Согласен, салфетку выкинуть будет не жалко, первый опыт он такой
Цитата Сообщение от MsGuns Посмотреть сообщение
Увлекаемся шаблонами ? Ну-ну
Не вижу причин для беспокойства, они немного облегчают житуху (ну это на первый взгляд, далее виднее будет)
Цитата Сообщение от MsGuns Посмотреть сообщение
В Ваше странице несколько блоков с группами контролов, они все связаны с одной сущностью БД ? Сдается мне, что нет.
Да, это относится к одной сущности
Цитата Сообщение от MsGuns Посмотреть сообщение
Опять же есть несколько Textarea для обширных текстов. Тут явно напрашивается комбинация параметров и JSON. Ну и асинхрон, конечно
Для чего тут JSON (ладно хранение ярлыков, это понятно, но, допустим, для даты последней модификации для чего там JSON)? Чтобы передавать модель в виде JSON-а?
Цитата Сообщение от MsGuns Посмотреть сообщение
Ну и, конечно, JS, куда ж без него.
Тьфу на него (лучше уж тогда Node или TypeScript) , в мире .Net он уже отмирает, на смену приходит Razor (Blazor)
Цитата Сообщение от MsGuns Посмотреть сообщение
По поводу бутстрапа.....Все хорошо для новичков и ленивых, не надо разбираться в стилях, адаптивность и отзывчивость, и все такое.. Но как же все это загрязняет код !
Согласен, но т.к. это личный и первый проект, то думаю простительно использовать готовые вещи
Цитата Сообщение от MsGuns Посмотреть сообщение
Но чтобы разобраться полностью, нужен макет страницы. А еще лучше не рэйзоровское "художество", а разметка, приходящая на Клиент.
А зачем все это делать на клиенте? Не проще на сервере всю эту работу организовать? Распарсить строку ярлыков (TagsString) в коллекцию, проверить на соответствие, при необходимости добавить новые/удалить старые.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
29.03.2021, 14:20
Саша, тут ведь какое дело..
Я начинал, как и Вы, с шаблонов, бутстрапов, даже колбасил Vui, но в условиях студии все это кошмарно громоздко и, главное, глючно. Я имею в виду отладку фронта. О глюках с кэшированием стилей и скриптов уже много писано здесь, повторяться не буду.
Вкратце так:
1. То, что мы видим в рэйзоре, мягко говоря, отличается от того, что в реале летит на клиент.
2. Все эти вьюшные вставки вкупе с шарпными "инъекциями" и зубодробительными классами страпа делают разбор кода представлений весьма не комфортным. Особенно, если используются частичные представления.
3. Страп, конечно, хорош. Может быть. Но все равно не обходится без собственных стилей. И тогда начинается путаница. Но если в своих разобраться не трудно, благо их не так уж и много (несколько сотен строк css), то лазать разбираться в страп - хорони, Господь.
4. Бесконечные танцы с переключением опций кэширования в браузере чтобы заставить его каждый раз при запуске приложения тянуть новые css и js очень быстро начинают бесить
5. Валидация. Куда проще (быстрее, изящнее, конкретнее) делать ее чисто JS, заодно выделяя стилями ошибки в полях ввода, чем все эти атрибуты, приползающие из хелперов в рэйзоре. К тому же опять-таки при ошибках "дергается" сервер.
6. Отсутствие прозрачного управления асинхронностью.
и так далее

Устав от всего этого я взялся плотно за HTML, JS, CSS. И отладку фронта вне студии, вообще вне сервера
Где взять контент, спросите Вы ? Без проблем - пишу какой-нибудь отдельный InitContent.js, в котором с помощью копипасты и за полчаса стучу заполнение страницы контентом.

В итоге, получив в каком-нибудь notepad++ готовые части (html,css,js), просто "внедряю" их в проект VS и сосредотачиваюсь на логике бэка. При этом фронт меня уже почти не отвлекает. Экономия нервов и времени колоссальная.

Для примера, попробуйте в "студии" сверстать какой-нибудь простенький отзывчивый макетик, а потом то же самое - в блокноте. И почувствуйте, как говорится, разницу

Отдельная тема - JS. Ну никуда от него не деться, никуда ! Вы просто не сделаете ни одного приличного веб-интерфейса без него. Если даже Вы явно его не используете, т.е. в проекте у Вас нет ни одного файла .js, это вовсе не значит, что JS не работает в Вашей странице. Убедиться в этом можно, заглянув в хедер Вашего html и увидев там всякие ссылки на js (тэги <Script>).
Я его тоже боялся как черт ладана Но, когда освоил более-менее, то понял, что это очень здорово ! Мало того, что Вы "оживляете" Вашу страничку, Вы еще существенно упрощаете код проекта (View). И, кроме того, делаете вещь, которые сложно сделать на сервере. Например, попробуйте организовать модальное окно или всплывающее pop-up меню на сервере. Или сделайте "карусель". Это, конечно, можно, но сколько у Вас это займет времени и что получится в итоге ?

Добавлено через 20 минут
И еще один важный момент. Точнее два.
I. Особенности проекта
Если Вам нужно сделать "сайт-картинку", ну что-то вроде "портала" какого-нибудь Мухосранского сельсовета, где есть фоточки, пару видосов, строка меню (типа "о Нас", "Коммуникации", "Правление" и т.д.) и новости в виде выстроенных вертикально блоков, то вполне можно обойтись "штатными" средствами VS. Вроде Вашей простынки, только без правки, конечно. (Правка, т.е. внесения изменений, в таких проектах очень часто делается простой заменой файлов на сервере безо всякого CMS)
Но на таких проектах заработаешь разве что "на хлеб", на масло вряд ли
В реальности для создания даже простенького сайта для интернет-магазина или того портала, по полнофункционального, с обратной связью, блогами, услугами и т.д. без JS, асинхрона, визуальных эффектов и т.д. все равно не обойтись.

II. Среда.
Если Вы попадаете в солидный Проект с командой, солидным инвестором и соответствующим финансированиям, то Вы воленс-неволенс будете работать с принятыми в "команде" стандартами. Если он юзают Angular, QJuery, BootStrap и еще тучу всевозможный причиндалов, Вам придется все это освоить и применять. И, хуже того, лезть в чужой код, разбираться в нем.
Тут уж, как говориться, "ешь что дают". И незнание JS, css и какого-нибудь фронт-фреймворка, оправданием быть не может. Как в армии - "Не можешь - научим, не хочешь - заставим".

Резюме: чем больше знаешь, тем меньше будет проблем с участием в Проектах (в том числе своих собственных)
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
29.03.2021, 14:36  [ТС]
MsGuns, все это прекрасно понимаю, но, "ем что дают" , для простого бложика можно было и WP запустить, не заморачиваться, но хотелось как всегда большего - научиться, поэтому решил заплить свой велосЕпеТ.
Теперь по поводу вопроса - я так и не понял, почему представление возвращает "новый" объект с "потерей" данных.
Не рассматривая работу с JS (возможно в будущем все-таки придется сделать усилие и выкурить его).
Нужно явно в представлении заполнять все поля объекта, чтобы ничего не "терялось"?
Или уже в обработчике post-запроса организовывать логику работы с ярлыками (добавлять, изменять и т.п.)?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
29.03.2021, 15:02
Лучший ответ Сообщение было отмечено Почтальон как решение

Решение

Цитата Сообщение от Почтальон Посмотреть сообщение
Да, это относится к одной сущности
Да ну ?
Не зная Вашей предметной области, сделаю такую "аллегорию":
Если Счет-Фактура. Сущность-документ. С атрибутами-характеристиками: номер, дата, контрагент и т.д.) Назовем его "заголовок". А есть перечень ТМЦ (как бывшему одинэснику, Вам этот термин, безусловно, знаком), состоящий из нескольких сущностей - строк фактуры, со своими же атрибутами-характеристиками (наименование, цена, количество и т.д.)

Пишем веб-интерфейс для работы со Сетами-Фактурами.
В нем показываем как заголовок, так и фактуру. Второй - как сетку (<div> или <table> - без разницы).
Даем править все, т.е. как заголовок, так и фактуру.
При этом кнопка "Сохранить" - одна, "Одна на всех, мы за ценой не постоим" (с)
По-Вашему, при отсылке всех изменений за раз, сколько сущностей мы правим на сервере ? Одну ? Как бы не так !
Изменениям подвергнется не одна таблица, а минимум две. В терминах MVC - 2 (две) модели.
О какой-же "моно-сущности" тут может идти речь ?

Так вот, можно сделать интерфейс так, чтобы при любых "точечных" изменениях, например после внесения правки в заголовок СФ или после изменения/удаления/добавления) одной строки фактуры, на сервер летел запрос на изменение одной записи в таблице. Естественно, тут уместно разделение методов контролера по функциональности. Один - на изменение Заголовка, другой - на изменение строки фактуры, третий - на добавление новой строки фактуры и т.д.
Все это, конечно, реализовать аяксом чтобы юзер не ждал и страничка не дергалась. Вот тут-то без JS просто не обойтись

Добавлено через 8 минут
Цитата Сообщение от Почтальон Посмотреть сообщение
я так и не понял, почему представление возвращает "новый" объект с "потерей" данных.
Не знаю, откуда Вы взяли такую мою фразу (много тут написал, возможно забыл, ткните носом
"Потеря" касается не столько данных, сколько "маркеров". Вам же известно, что такое "состояние страницы" ? При полной перечитке страницы ( а у Вас нет аякса, поэтому после каждого чиха на сервер, страничка будет полностью перечитана) оно, безусловно, будет утеряно. Даже если Вы на сервере промаркируете все текущие элементы (например, выделение фоном блока с курсором), расположение этого блока на перечитанной странице будет иным (например, блок был вверху экрана, а после перечитки станет внизу). Плюс экран "дернется" (по понятной причине)

Именно это я и имел в виду.

Добавлено через 5 минут
Цитата Сообщение от Почтальон Посмотреть сообщение
Нужно явно в представлении заполнять все поля объекта, чтобы ничего не "терялось"?
Да, конечно, обычно это делается в скрытых тэгах для например айдишников, и в тэгах открытых для восстановления того, чего юзер ввел до отсылки запроса. При полной перечитке страницы это делать придется. Именно для этого Вы и используете дифференциацию запросов и методов на входные (GET) выходные (POST).

Я же Вам толкую об AJAX, где такой дифференциации делать не нужно. Один метод GET и все. Ну и, конечно, вопросы конфеденциальности мы тут не затрагиваем.

Добавлено через 2 минуты
Если Вам интересно, мы можем связаться по скайпу
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
29.03.2021, 15:16  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Не зная Вашей предметной области, сделаю такую "аллегорию"
Да предметная область простая до безобразия - бложик, с функционалом релевантных статей. Релевантность определяется наличием ярлыков.
Т.е. грубо, на коленке (могут быть ошибки, а к исходнику доступ только вечером):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Article
{
   public int Id {get;set;}
   public string Caption {get;set;}
   public string Keywords {get;set;}
   public virtual ICollection<Tag> Tags {get;set;}
}
 
public class Tag
{
   public int Id {get;set;}
   public string Title {get;set;}
   public virtual ICollection<Article> Articles {get;set;}
}
Как поступить при редактировании экземпляра объекта Article ? Как быть с ярлыками (тегами) ? При передаче в представление, Tags присутствуют. При возврате в контроллер при метде POST - Tags - пустое.

Добавлено через 4 минуты
Цитата Сообщение от MsGuns Посмотреть сообщение
Да, конечно, обычно это делается в скрытых тэгах для например айдишников, и в тэгах открытых для восстановления того, чего юзер ввел до отсылки запроса.
вооо, вот это я и хотел выяснить , значит в моем варианте - нужно какой-то скрытый список, из которого потом заполнить модель в представлении.
Цитата Сообщение от MsGuns Посмотреть сообщение
Я же Вам толкую об AJAX, где такой дифференциации делать не нужно.
Я наслышан об этой технологии, но пока руки не доходят

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от MsGuns Посмотреть сообщение
Если Вам интересно, мы можем связаться по скайпу
интересно конечно пообщаться с опытным и умным человеком, но пока не хочу вас обременять :)

0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
29.03.2021, 18:41
У Вас очень большой косяк в базе. Отношение многие-ко-многим Вы пытаетесь реализовать через перекрестные ссылки.
"А это бандитизъм" (с) Не мудрено, что EF обкладывает Вас матами.
Нужна дополнительная перекрестная таблица, через которую Вы и будете "дергать ниточки" (тэги), А ссылки "друг на дружку" ф топку, т.е. удалить совсем.

Добавлено через 1 минуту
И эта.. бросайте все и жуйте аякс + JS.
Нельзя стать моряком, не научившись плавать

Добавлено через 22 минуты
Цитата Сообщение от Почтальон Посмотреть сообщение
Как поступить при редактировании экземпляра объекта Article ? Как быть с ярлыками (тегами) ? При передаче в представление, Tags присутствуют. При возврате в контроллер при метде POST - Tags - пустое.
"Аллегорируем" дальше
Есть четыре таблицы
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE Article (
  AId INT IDENTITY(1,1) PRIMARY KEY,
  ATitle VARCHAR(MAX) NOT NULL,
  AAutor VARCHAR(MAX) NULL
)
 
CREATE TABLE Chapter (
  CId INT IDENTITY(1,1) PRIMARY KEY,
  CAId INT REFERENCE Article(AID) NOT NULL,
  CTitle VARCHAR(MAX) NULL,
  CContent VARCHAR(MAX) NOT NULL
)
 
CREATE TABLE Tag (
  TId INT IDENTITY(1,1) PRIMARY KEY,
  TType VARCHAR(MAX) NULL,  // Тип тэга: "Экономика" , "История".. Может быть (а может, и должен) справочник
  TText VARCHAR(MAX) NULL,
)
 
CREATE TABLE CrossTags (
   CRId INT IDENTITY(1,1) PRIMARY KEY,
   CRCId INT REFERENCE Chapter(CID) NOT NULL, 
   CRTId INT REFERENCE Tag(TID) NOT NULL, 
)
Выборку как статей(глав статей) по тэгу, так и тэгов по главе (главам статьи), думаю, Вы без труда напишите сами.

Идем дальше

Добавлено через 25 минут
Строим модель. С использованием EF, я так уже не делаю, но сделаем так, недостатки быстро себя обнаружат
С сущностями-таблицами (моделями EF) все ясно - при мапировании просто на них чекаем. Получает контекст EF с DBSet<[Имя таблицы БД]> на каждую из таблиц + классы моделей, по одну на каждую таблицу.
Эти классы-интерфейсы (DBSet) нам понадобятся главным образом для внесения правок.

Осталось решить, что мы делаем с отображением (представлением, затем веб-страницей)
Ясно, что таблицы для этого не нужны, а нужны результаты выборок. Т.е. дополнительные классы моделей и дополнительные методы для их извлечения.

И вот тут дилемма.

1 Путь. "Серверный"
Добавление в БД новых сущностей - UDF или SP (тут простое правило - если можно обойтись UDF, то делать ее. SP только если в теле UDF реализовать алгоритм выборки нельзя из-за ограничений стандарта/диалекта SQL, например в TSQL в теле UDF нельзя вызвать SP, а также вернуть более одного датасета). Полученные сущности UDF + SP добавляются обновлением Модели через БД.
В результате получим новые классы + методы контекста. Все - в папке edmx, т.е. внутри EF.
Небольшой спойлер Если с UDF все будет вполне прогнозируемо, то с SP могут быть "чудеса" и это - первый недостаток 1-го пути.

2 Путь. "Расширение ORM"
В базу не лезем от слова совсем.
Исходя из требований интерфейса составляем новую Модель, в которую включаем все, что нужно для интерфейса. Вместе с id предусматриваем наименование, тексты и вообще все, что нужно. Именно по этой модели будем строго типизировать будущие представления, возможно, частичные.
Модель создали. Как с ней работать ?
Для этого создаем статичный класс Repository, где будем писать методы для получения новых классов расширения Модели.
В каждом методе извлекается и обрабатывается "свой" датасет. Запрос можем писать используя LINQ. При этом никто не запрещает использовать "штатные" модели самого EF, ибо репозиторий его видит.
В итоге получаем репозиторий с нужными методами, возвращающими нужные датасеты. Да-да, именно те, которые у нас предусмотрены интерфейсом и по которым типизируются частичные представления. (Почему именно частичные, думаю, понятно).
Минус - то, что приходтся работать не только мышкой, но и ручками, и головкой. Плюс - гибкость и получение некоторой независимости (иногда о-о-очень существенной и даже критичной) от стоглавого и стозевного IF.

Также не забываем, что расширение касается только извлечения моделей, но никак не внесения в них изменений. Это - важно ! По крайней мере, в нашем случае.

Добавлено через 26 минут
С моделью разобрались.
Приступаем к логике.
1. Контроллер.
Для простоты опускаем пока все авторизации и ограничиваемся единственным стандартным методом Index, основное назначение которого - отправить Клиенту стартовую страницу. Добавили новый контроллер и пока код его не трогаем ибо не знаем точно, что он должен собрать для представления Index.

2. Представление Index. Создаем как обычное, не строго типизированное (пока). Получаем болванку html. Если уже есть фронт (как писалось выше), то вся разметка из блокнота тупо переносится в представление. css и js если таковые имелись в нашем мини-проекте верстки в блокноте, также добавляются в проект в папку Content (созданную нам же в ручном режиме).
Из верстки сразу видно, что нам нужно:
1. Список статей - например в блоке левой части тела HTML
2. Список глав для текущей (выбранной статьи). Например через комбобокс где-нибудь вверху страницы, но рядом со списком статей.
Возможно главы добавить в список статей как подуровень - это уже как вздумается. Точнее, как определено в ТЗ.
3. В оставшейся части страницы (правый блок верстки) - одну главу по текущей (выбранной) статье. Это - если главы в "дереве со статьями". Иначе просто идут подряд одна под другой вложенными блоками (flex).

Итак, что нам нужно:
1. Список всех статей или статей и глав (для левой части)
2. Содержание текущей главы (если главы в дереве) или всех глав статьи (иначе)

Теперь возвращаемся к контроллеру и пишем код, который вернет нам:
1) Список всех статей (метод репозитория), желательно отсортированный (добавляем логику сортировки в соответствующий метод репозитория) - пишем строчку в методе контроллера
C#
1
 List<ArticleView> avlist = REPO.FetchAllArticles();
теперь надо определиться с текущей статьей.
Для этого добавляем код
C#
1
ArticleView av = avlist[0];
Теперь, зная Id текущей статьи, выгребаем главы этой статьи
C#
1
List<Chapter> chlist = REPO.FetchAllChaptersByArticleId(av.AId);
Итак, данные получены. Нужно их отправить в Представление.

Добавлено через 21 минуту
Тут тоже развилочка
1. Все - в одном представлении
2. В главном представлении только каркас + детализация текущей статьи (имеется в виду содержимое таблицы Acticle), все остальное - в частичных.

1. Все - в одном. Каркас + разметка всех контентов.
Строгая типизация ? По какому классу, если их у нас минимум 2 (я еще ничего не говорил о тэгах, это - дальше) ?
Это мы видим из логики кода метода контроллера Index.
Есть два подхода а) : через класс-контейнер и строгую типизацию View по этому классы и б) строгой типизации нет вообще, датасеты передаются через ViewBag, в теле представления для обращения к датасетам с моделями или модели (в нашем случае - статье) делается явное приведение типа.
В обоих случаях для верности добавляем в Index.cshtml самой первой строкой
C#
1
@using AlexanderFineWebSolution.Models
Далее для каждого блока контента пишем разметку (для списков и гридов-блоков) - в цикле, предварительно типизируя модель (если не было строгой типизации) или через @Model, где Model - это контейнер, в котором, как мы понимаем, лежат все данные, включая датасеты.
Не забываем при этом о стилях, выделяя "текущие" или "активные" элементы везде, где нужно. При стартовой странице - это 1-я глава.

2. Частичные представления.
Нет желания описывать все подробно. Думаю, что тут все должно быть ясно.
Каждое частичное на свою модель.
Привязка к мастер View.
Подключение к Мастеру через PartialView с передачей нужной модели через параметр, как обычно.

Добавлено через 11 минут
Ах да !

Для просмотра и редактирования самой статьи и глав надо тоже в макете предусмотреть блоки, где будут инпуты с названием статьи, автором и т.д.
В главном View создать разметку, где все это показать.
Тот же самое с главами, но в другом блоке макета страницы.

Заполнение - из модели (строго типизованной либо приведением типа), благо контроллер всю информацию нам "сбросил".

Добавлено через 15 минут
Стартовая страница есть, мы ее видим и все хорошо.

Теперь собственно GUI. Юзер клацает по нашим блокам и мы должны как-то реагировать.
Прежде всего : а) никаких асинхронов, аякс идет лесом, б) страница обновляется полностью.

При этом всем появляется вопрос: что, если юзер поредактировал статью или главу или содержимое главы, а потом и клацнул на другую статью в дереве - что делать с его изменениями ? Либо алертнуть, что, мол, а не сохранить ли то, что он тут понавводил ? Либо автоматом сохранить с валидацией. Учитывая, что боимся JS, т.е. alert противопоказан, остается решать автоматом, т.е. пытаться сохранить и потом уже перескакивать на другую статью, обновляя все данные в блоках для редактирования, а также все блоки с контентом. Вопрос. И я не знаю как его решить без JS.
Можно, конечно, блокировать смену статьи до того, как не нажата кнопка "Сохранить" или "отменить". Но тут опять нужен JS !!!
Решаемо, конечно, но для этого надо свернуть горы.
Во-первых, создать метод Index c [HttpPost], насовать в него кучу параметров (можно, конечно, через модель, но на клиентской разметке все равно будет туча параметров.
Во-вторых, вызов метода на клик на списке - реализовать через форму не знаю как, ибо данные разбросаны по фрагментам макета, но Вы, похоже, с этим освоились серверной разметкой
В-третьих, в коде метода проверить, не изменились ли значения той же статьи по сравнению с теми, которые в базе и, если изменились, то вернуть то, что получили, с ошибкой валидации типа "не нажали на кнопку Сохранить".
Короче, геморрой из геморроев Но сделать, конечно, можно.

Добавлено через 8 минут
Думал продолжить, но, честно говоря, не хочу. Ибо геморрой страшный
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
30.03.2021, 07:36  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
И эта.. бросайте все и жуйте аякс + JS.
да-да, уже обдумываю и подыскиваю материал
Цитата Сообщение от MsGuns Посмотреть сообщение
Короче, геморрой из геморроев Но сделать, конечно, можно.
Согласен, но мне кажется все должно решаться очень просто
Цитата Сообщение от MsGuns Посмотреть сообщение
У Вас очень большой косяк в базе. Отношение многие-ко-многим Вы пытаетесь реализовать через перекрестные ссылки.
по мотивам вот этой темы: Тэги к статьям, или организация ралевантного контента
Первоначально я делал через таблицу соответствий, но подумал что это какой-то кустарный способ (с EF не работал в плане связи M:M).
Нужно переварить ваш пост.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
31.03.2021, 02:39
Цитата Сообщение от Почтальон Посмотреть сообщение
да-да, уже обдумываю и подыскиваю материал
Материала действительно много. И 90% откровенное овно, типа ХаудиХо
Тут нельзя размещать ссылки, поэтому просто найдите на трубе каналы "Анна Блок", "Фрилансер по жизни". Особенно последний (хотя и Аннушка хороша !) - по верстке я лучшего материала не встречал. Отличная речь, все по делу, кратко, емко. Советую хотя бы ознакомиться

Что касается JS, то тут все много хуже.. Попробуйте "Владилен Минин" или "ITVDT", этот лучшее, что мне встречалось именно по JS

Добавлено через 3 минуты
Книжки по JS категорически не советую - масса воды, картинок (скриншотов), куча времени и мизерный эффект. Хотя, возможно, хорошей книжки мне просто не встретилось

Основной источник - это, конечно, инет. MSDN, кстати, совсем не плох, если правильно им пользоваться
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
31.03.2021, 07:13  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Советую хотя бы ознакомиться
Спасибо большое! С версткой более-менее знаком, это не проблема.
Цитата Сообщение от MsGuns Посмотреть сообщение
Что касается JS, то тут все много хуже..
Цитата Сообщение от MsGuns Посмотреть сообщение
Попробуйте "Владилен Минин" или "ITVDT", этот лучшее, что мне встречалось именно по JS
На udemy полгода назад приобрел курс, пару уроков посмотрел и понял, что в JS творится 100% магия, и если код работает, это не означает что он работает именно так, как ты этого хочешь, вот за это я и не люблю этот JS (2 + 2 = 22)
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
31.03.2021, 16:08
Цитата Сообщение от Почтальон Посмотреть сообщение
понял, что в JS творится 100% магия, и если код работает, это не означает что он работает именно так, как ты этого хочешь
Вы не правы. Просто JS не строго типизированный язык + интерпретатор. А в остальном, прекрасная маркиза, все хорошо, все хо-ро-шо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2021, 16:08
Помогаю со студенческими работами здесь

Ошибка при передаче свойства типа double с View в контроллер
Столкнулся с проблемой передачи типа decimal. Когда контроллер получает модель в Price всегда 0. Числа пробовал передавать в формате 0.00...

Теряются данные при Insert
Здравствуйте! Третий день ломаю голову. На форме есть несколько textbox string insert_command = (&quot;INSERT INTO inbox (num,...

Теряются данные при работе с WinPcap
Господа, я не пишу под Винды и никогда не буду. У меня есть молодой человек, который этим занимается. Уже несколько недель, он не может...

Теряются данные при send/recv
на сервере отправляю в цикле данные с помощью send(); на клиенте в цикле их получаю с помощью recv(); char* b = new char{}; ...

Теряются данные при выводе в textbox
Код: private void client_Advise(object sender, DdeAdviseEventArgs args) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru