D&D и ASP Core.  Начало.

Вряд ли чушь, которую я буду здесь нести будет вам интересной, однако подобные отписки и ваша реакция способна смотивировать меня не забрасывать работу =)



Сначала небольшая предыстория.

Не так давно, один мой старый друг, в поисках и генерации идей на тему "чего бы такого поделать" предложил себя в роли ГМа в D&D. Про D&D все мы слышали, но никогда не пробовали и даже не разбирались, идею все поддержали и было решено начать некий курс подготовки по пониманию того что нужно выучить и т.д.


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


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

Excel на макросах, выколите мне глаза Не то чтобы это было проблемой, но как телу технологий, мне подгорело.

В связи с переходом на новую работу, мне также нужно было быстро изучить ASP Net Core, EF Core и прочие свистоперделки веб программирования.


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


Отступление - господа, я лишь начал осваивать веб направление, понимаю что можно написать лучше и быстрее(особенно быстрее), но все решения я ищу сам и это занимает большую часть работы(%так 80), да гугл наше все.


Первые 3 дня работы:

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

Это не модели для работы с EF это классы, для внутренних расчетов и насчетов в памяти, для более удобной выдачи и поиска информации.

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


С помощью Scallfold я мигрировал модель с базы на приложение, дальше модель ведется руками.

Был создан контроллер, с ним было много возни, ведь именно туда с помощью DI мне пришлось закидывать контекст базы и учить ее работать с выборкой ХП, также была создана сущность под выборку данных из ХП.


Был создан новый Layout и созданы представления(с которыми я как раз сейчас работаю).

Что ты пишешь какую-то чепуху непонятную, нам бы посмотреть что ты напилил.


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


Что есть - базовая пресет страничка MVC приложений, с одним измененным именем.


Это уже сам сайт если чо.

А вот и сама вкладка.

Собственно с этими Select я долго маялся, логика такая:

Из базы подтягиваются базовые расы и их типы, все эти данные хранят на сервере.

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

На этом пока все, сейчас работаю с выбором типа расы и заполнением опций этого селекта.

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


Будет кнопочка "подробно" и вы сможете прочитать о вашей расе или ее типы куда больше информации.


Спасибо, если есть вопросы по реализации или еще что-то пишите.


Если это вообще кому-то было интересно -_-

1
Автор поста оценил этот комментарий

Форму сабмитить нужно тогда, когда она уже полностью заполнена. До этого вы ajax-ом на каждое change-событие предыдущего select подгребаете порцию данных, под которые динамически создаете select/options и заполняете их значения из прешедшего json-ответа. И так до тех пор, пока вся форма не будет заполнена. Потом раздисейблите submit-кнопку и юзер сможет отправить форму.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Она заполнена, просто логика заполнения Value другая + он почему-то считает нужным сериализовать параметр Name...


Заполнять Select он предзаполнен, мне нужно лишь правильно его отфильтровать что я уже делаю.

Но для этого же мне в его Value нужно 2 значения.



+ формировать JSON ответ в корректной форме геморно ._.


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


Следующие формы начну продумывать лучше.

показать ответы
1
Автор поста оценил этот комментарий

как обработать возвращаемый запрос так, чтобы он изменил View

В случае асинхронного запроса вы должны самостоятельно перестраивать UI.

При синхронном запросе просто загружается другая страница.


Контроллер делает Return View("ViewName", Model) - как это обработать аяксом я без понятия.

Вы делаете View(), а не Json, поэтому получаете готовый HTML. Вставляйте его туда, куда хотите. Что-то вроде document.getElementById('result').innerHTML = response;


ЗЫ А вообще - попробуйте сначала без аякса вообще, а потом с ним. Смешивать лапшу без понимания - такое обучение может затянуться надолго (=

раскрыть ветку (1)
Автор поста оценил этот комментарий

Завтра запилю пост что сделал, как выглядит и т.д. )

1
Автор поста оценил этот комментарий

как обработать возвращаемый запрос так, чтобы он изменил View

В случае асинхронного запроса вы должны самостоятельно перестраивать UI.

При синхронном запросе просто загружается другая страница.


Контроллер делает Return View("ViewName", Model) - как это обработать аяксом я без понятия.

Вы делаете View(), а не Json, поэтому получаете готовый HTML. Вставляйте его туда, куда хотите. Что-то вроде document.getElementById('result').innerHTML = response;


ЗЫ А вообще - попробуйте сначала без аякса вообще, а потом с ним. Смешивать лапшу без понимания - такое обучение может затянуться надолго (=

раскрыть ветку (1)
Автор поста оценил этот комментарий

я понимаю что суть аякса не в этом, но также я понимаю что сериализация данных с формы работает отвратно, мне не нужно имя, выбранное записи, мне нужно Value, мне нужно Value в формате JSON переданное в мой метод на контроллере, а не шлак.


Зачем мне перестраивать всю страницу вручную, а как мне потом жмакать кнопочку назад так, чтобы нихрена не испарилось, странички вообще привязаны к вкладкам, это должны быть разные View не связанные друг с другом, они связаны только на уровне моделей и мб контроллера(но это не точно).


Проблема не в аяксе или представлениях, проблема в том как сериализатор формы выполняет свою работу >.<


Удобно работать с Input type = text в примерах, с полной привязкой к модели, но когда надламываешь эти связи, видишь мягко говоря жопку )


Я уж не буду говорить что сериализатор выдает данные в формате "полная чушь" и почему-то твердое значение 0 он представляет как &кодировки. причем не нуля и причем две.


Поэтому да, 2 запроса, ибо честно, после клиента - это называется пользовательский интерфейс работает через жопу.

показать ответы
1
Автор поста оценил этот комментарий

Вы синхронный и асинхронный запрос делаете? Но почему не одним из?

раскрыть ветку (1)
Автор поста оценил этот комментарий

потому что я без понятия как обработать возвращаемый запрос так, чтобы он изменил View.


Контроллер делает Return View("ViewName", Model) - как это обработать аяксом я без понятия.

Может перегрузить метод сериализации формы, вместо него сделать мой GetSelectedParams.

Но как тоже без понятия )

показать ответы
1
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

не спрашивайте как это работает, но в 2 запроса я получаю и переключение формы и результат.

Как сделать "нормально" понятия не имею ._.

Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

как работает SRC в скрипт тегах?

Либо src, либо скрипт в теле. Не смешивать.

раскрыть ветку (1)
Автор поста оценил этот комментарий

нет просто если первым подключить не jquery, то он будет ругаться на его использование в теле скрипта.


Скрипты юзаются при построении View если это не функции, это я понял.

Но странно что порядок подключения имеет значение.

показать ответы
1
Автор поста оценил этот комментарий

этот скрипт переопределяет событие - так?

Можно повесить обработчик, который отменяет событие. Это не переопределение, а паттерн наблюдатель (observer).

раскрыть ветку (1)
Автор поста оценил этот комментарий

а даже так, ок я понял, хотя и криво это конечно.

0
Автор поста оценил этот комментарий

нужно ловить событие submit, а не click: $(...).on('submit', function(e){ e.preventDefault(); ... });

раскрыть ветку (1)
Автор поста оценил этот комментарий

Исправило проблему, но я не очень понял как работает SRC в скрипт тегах?

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий

нужно ловить событие submit, а не click: $(...).on('submit', function(e){ e.preventDefault(); ... });

раскрыть ветку (1)
Автор поста оценил этот комментарий

не не, тут другой вопрос - этот скрипт переопределяет событие - так?


Как сделать так, чтобы он запустился сразу при построении страницы.


С кликом или submit(с обоими) проблем нет.


Вынес в отдельный блок скрипт.

Этот код рабочий, что с кликом что с сабмитом, если я повешу на Select On click его, то у меня при отправке данных корректно отрабатывает переопределенное событие.


Проблема - я не могу его переопределить сразу )

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Да, по щелчку по кнопке submit браузер просто делает синхронный запрос на сервер (с перезагрузкой страницы). В отличиt от простой ссылки, форма умеет делать HTTP-запросы методами, отличными от GET и передавать ввод пользователя (инпуты, селекты, textarea, чекнутые чекбоксы и радиобаттоны, файлы и т.п., хоть все и сразу).

Для этого не нужно вообще никакого JS и вешать обработчики (как у вас onsubmit и прочее), это происходит автоматически средствами браузера. Достаточно лишь указать подходящй аргументам экшна name для инпутов, благодаря которым model binder создаст нужные обекты-аргументы.


Если вы ходите асинхронный запрос (аякс, без перезагрузки страницы), то форма как таковая не нужна - полетит то, чем вы зарядите вызов функции (ну те же $.get/$.post/$.ajax). Но для семантичности форму можно оставить, но повесить на submit-кнопку обработчик, который первым делом будет отменять отправку формы (т.е. действие кнопки по умолчанию - event.preventDefault(); ), затем собирать данные из контролов и отправлять запрос на сервер и обрабатывать ответ, перестраивая интерфейс.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Сделал вот такое.

В чем суть Prepare - нужно вызывать заранее, иначе все под хвост, ибо он тупо переопределяет клик.

Submit по хорошему должен перегружать, но нифига не перегружает, что меня дико раздражает.

Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

Да, по щелчку по кнопке submit браузер просто делает синхронный запрос на сервер (с перезагрузкой страницы). В отличиt от простой ссылки, форма умеет делать HTTP-запросы методами, отличными от GET и передавать ввод пользователя (инпуты, селекты, textarea, чекнутые чекбоксы и радиобаттоны, файлы и т.п., хоть все и сразу).

Для этого не нужно вообще никакого JS и вешать обработчики (как у вас onsubmit и прочее), это происходит автоматически средствами браузера. Достаточно лишь указать подходящй аргументам экшна name для инпутов, благодаря которым model binder создаст нужные обекты-аргументы.


Если вы ходите асинхронный запрос (аякс, без перезагрузки страницы), то форма как таковая не нужна - полетит то, чем вы зарядите вызов функции (ну те же $.get/$.post/$.ajax). Но для семантичности форму можно оставить, но повесить на submit-кнопку обработчик, который первым делом будет отменять отправку формы (т.е. действие кнопки по умолчанию - event.preventDefault(); ), затем собирать данные из контролов и отправлять запрос на сервер и обрабатывать ответ, перестраивая интерфейс.

раскрыть ветку (1)
Автор поста оценил этот комментарий

А если при этом у меня изменяется маршрутизация?

Тобишь перезагрузка странички логична, ибо будет получен новый Route и новый View.

1
Автор поста оценил этот комментарий

Избыточная выборка из БД - зло. Избыточные данные на клиенте - зло в квадрате. Но ajax и ленивая подгрузка данных/пейджинг усложняют архитектуру, а то и вообще UX ("бесконечный скролл" в фотоальбомах - идеальный пример зла). Нужно как-то балансировать (=


Под избыточностью стоит понимать данные, большая часть которых скорее всего пользователю не понадобится.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Дошел до Submit формы, туплю.

В чем вообще суть Submit? Она передает данные на сервак или лишь говорит мол все ок, форма готова?


Кароче как использовать Submit для вот такой формы? Если результатом формы является JS функция выбирающая параметры с селектов и пихающая их в JSON?

Иллюстрация к комментарию
Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

Ну, значит, ищет первый подходящий роут. Если роуты задавать в Startup.Configure, то там имеет значение порядок добавления роута в коллекцию (более специфичные маршруты нужно вставлять раньше), а как это дело в атрибутах обстоит - пока не сталкивался, нужно будет вчитаться в документацию.

раскрыть ветку (1)
Автор поста оценил этот комментарий

ну и JSON прекрасно парсится аяксом(проверил формированием Get запросов), сервак понимает что за данные ему пришли(о чудо) ^^

Больше нет колдовства с URL.

1
Автор поста оценил этот комментарий

Ну, значит, ищет первый подходящий роут. Если роуты задавать в Startup.Configure, то там имеет значение порядок добавления роута в коллекцию (более специфичные маршруты нужно вставлять раньше), а как это дело в атрибутах обстоит - пока не сталкивался, нужно будет вчитаться в документацию.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Покорил JSON вы очень помогли(вот прям вообще), сделал фильтры на значения, умудрился в Value селекта запихнуть JSON через Razor.

Все данные по базовым классам передаю сразу, потом фильтрую в зависимости от выбора, онклики на удаление дефолтной "выберите расу..." перевел на onfocus, теперь все кошерно.


Теперь буду подтягивать описания на расу и на класс и затем уже передавать данные о выборе на форме, для выбора класса. В целом описания могу передать таким же макаром через Value в селект, также описывая JSON но надо ли тягать такие объемы данных(а там не так мало текста) не уверен, хотя модель и так их сейчас тащит, не знаю как лучше, может и буду сразу подтягивать и дальше также в JSON(не думаю что тут есть большая разница).


Меньше обращений к базе - быстрее работа, не круто когда юзверь ждет пока сервак обработает запрос, перешлет его базе, вернет и т.д. и т.п.

Хотя на серваке данные можно подтянуть изначально, а потом лишь выводить их из модели, но лишний запрос к серверу, тоже не знаю надо ли, я так понимаю этого стараются избегать ибо не правильно сервак мучать, а вот клиентские машины можно )


Ну и форму с сабмитом и следующая страничка по классам, там уже будет быстрее, потом атрибуты.

показать ответы
1
Автор поста оценил этот комментарий

будет приоритетней чем

Это неоднозначность, роуты конфликтуют из-за "?". Мне кажется, что из-за этого должна будет ошибка. Будь вы роутером, на какой стул сядите роут пойдете, если юзер попросит Character/Create/ ? Юзер забыл указать RaceSelect или не собирался?

раскрыть ветку (1)
Автор поста оценил этот комментарий

На первый, мол не указал значит без указания )


Ошибки нет(что забавно), просто стабильно валится на первый метод и все

показать ответы
1
Автор поста оценил этот комментарий

Я сделал нечто подобное, Get на аяксе(jquery синтаксис это просто жопа какая-то).

Придется попривыкнуть) Все же API jQ проще, чем родное браузерное.

Только вы результат никак не ловите из запроса. Нужен либо явный коллбэк передавать в функции get/ajax, либо работать с промисами (как в моем примере). https://api.jquery.com/jquery.get/


Вы там еще хитро строите Url на JS, но я бы советовал генерить это статически через Razor и класс Url. Они умеют самостоятельно строить ссылкы по роутам и исключают возможные проблемы при отображении контента из iframe.


Что вообще такое JSON - js object notation - что он из себя представляет?

Формат организации текстовых данных, который представляет из себя валидный литерал объекта JavaScript (обратное не всегда верно). Подробности - на википедии.


json(model) - тут можно поподробней?

Можно - https://metanit.com/sharp/aspnet5/5.4.php

ASP_NET Core умеет автоматически сериализовать сишарповые объекты в строку в json-формате. Делается это функцией:

JsonResult Controller.Json(object).

раскрыть ветку (1)
Автор поста оценил этот комментарий

да я знаю )

Мне пока нечего ловить в callback(ну в контроллере еще нет нужной логики), я разбирался с тем, чтобы он на нужный метод попал, теперь все стало на свои места, нужно прописать код :З


Вопрос IActionResult может в себе принять JsonResult и развернется ли такая схема на стороне браузера?


Ну грубо говоря, вот у меня один метод, я направил ему Get, получил обратно JSON(там кстати не один объект, там список получается, на базе которого я буду заполнять инфу во втором Select(и тут доп. вопрос, а я могу на стороне клиента тупо поменять модель, и вернуть тот же View(model) - или он тогда перезагрузит страничку, что нам не нужно по факту?)

иии этот же метод должен возвращать View(model) в первом случае.


ии JsonResult во втором.


Или тогда лучше все же разделить URL по Action, чтобы не пихать все в один?


Спасибо огромное, очень помогли )

показать ответы
1
Автор поста оценил этот комментарий

это же гавнокодище

Вы всегда можете написать свою/расширить дефолтную имплементацию фабрики контроллеров и сделать няшно (=


С точки зрения семантики HTTP это нормально, ибо роут "документа" один и тот же (опциональные параметры сюда не входят). Если вы хотите сделать действительно разные ресурсы (/character/create и /character/create/5 или, там, /character/create/race=5), нужно отразить это в его роуте специальным сегментом, как я уже говорил.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ок.

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


Я понял и он должен быть четким и не опциональным, просто я думал что маршутизатор поумнее и мол если он увидит опциональный параметр, то пойдет по методу который в Route явно имеет этот параметр.

Ну типо при запросе с параметром:

Это  [Route("[controller]/[action]/{RaceSelect?}")]

будет приоритетней чем

Это [Route("[controller]/[action]")]


При этом саму цифру 5 я при таком раскладе никак не могу подогнать под опциональное значение.

показать ответы
1
Автор поста оценил этот комментарий

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

То есть в контроллере теперь у вас не View(model), а:

return Json(model);

Тогда на клиенте это запросим (с помощью jQuery):

const raceId = 3; // selected by user

const URL = '@Url.Action("Create", "Character")';


$.get(URL, { race: raceId })

    .done(function (response){

        //use json data

});

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я сделал нечто подобное, Get на аяксе(jquery синтаксис это просто жопа какая-то).

json(model) - тут можно поподробней?

Что вообще такое JSON - js object notation - что он из себя представляет?


Вообще параметры внутрь запроса, когда я впихиваю их в URL - 0 проблем.

Если я пытаюсь их пихнуть как data параметры - жесть.


Что я пытаюсь сделать? - некий универсальный конструктор запроса, который будет строить мне URL и ajax запрос с нужными параметрами, исходя из места откуда я его вызываю.


Чтобы не писать отдельную функцию на каждое действие, сформировать запрос с хардкода - без проблем, но я очень не люблю хардкодить.


Вместо одной функции формирования запроса, у меня получится 2 функции формирующие запрос, отличающийся наличием параметра у RaceTypeSelect грубо говоря, URL практически одинаковый при этом выходит.

Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

боюсь что ViewModel я не обладаю

Это был пример "на вырост", тот же принцип будет справедлив для экшна:

[HttpPost] public IActionResult Create(IDictionary<string, int> skillValues)

и инпутов с именами

skillValues[mykey]

.

при таком виде запроса, я все равно попадаю на чертов первый Get

Первый экшн у вас такой же подходящий, как и второй, ибо вы используете опциональные GET-параметры. Если бы там был кастомный роут (вроде {controller}/{action}/{raceselect} ) или отличался HTTP-метод, то всё разрулилось бы. Подробнее можно почитать здесь: (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/ro...)


Для достижения вашей конкретной цели попробуйте объединить экшны в один:

[HttpGet] public IActionResult CreateCharacter(int? RaceSelect) {

    if (RaceSelect.HasValue) {...}

    else {...}

}

раскрыть ветку (1)
Автор поста оценил этот комментарий

"Для достижения вашей конкретной цели попробуйте объединить экшны в один:" - понял, объяснили, спасибо.

Просто на такое мне рвет жопу, это же гавнокодище )


Хотя я не думаю что мое View сильно лучше )


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

Страница то не меняется, я только данные подменяю и корректирую.

показать ответы
1
Автор поста оценил этот комментарий

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


Но если вам необходимо GET-запросом просто отобразить форму (вернуть View), с которой потом будет POST-запрос в отдельный метод, то это вполне допустимо. С дефолтным роутом будет вроде такого:


public class CharacterController {

    [HttpGet] // GET: /Character/Create/?race=5

    public IActionResult Create(int race) {

        var model = new CharacterModel(race);

        return View(model);

    }


    [HttpPost] // POST: /Character/Create/

    public IActionResult Create(CharacterModel newCharacter) {

        if (ModelState.IsValid) {

            _repository.Save(newCharacter);

            return RedirectToAction("index");

        } else {

            return View("Create", newCharacter);

        }

    }

}

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я понимаю, но ситуация:

Допустим мы подтянули дефолтные данные для пользователя, НО у юзера есть и свои кастомные данные(например расы которые создал он сам).


Их может быть много(теоретически).

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

Проблема в том, что выборка и так избыточна, мне не нужно так много данных. С помощью запроса я могу отослать уточняющую инфу и получить выборку данных из модели по конкретным Id, саму модель я при этом не меняю, я лишь меняю заполненность данными.


В качестве дефолта я сделаю другое решение, но это может мне пригодится позднее.

показать ответы
1
Автор поста оценил этот комментарий

только как его потом раскрыть на стороне сервака?

Вот тут (https://docs.microsoft.com/en-us/aspnet/core/mvc/models/mode...) написано:

Model binding looks for the pattern parameter_name.property_name to bind values to properties. If it doesn't find matching values of this form, it will attempt to bind using just the property name. For those types such as Collection types, model binding looks for matches to parameter_name[index] or just [index]. Model binding treats Dictionary types similarly, asking for parameter_name[key] or just [key], as long as the keys are simple types. Keys that are supported match the field names HTML

То есть, например, если юзеру покажете форму:


<form asp-action="Create" asp-controller="Character" method="post">

    <input type="number" name="newCharacter.skillValues[power]" required />

    <input type="number" name="newCharacter.skillValues[agility]" required />

    <input type="number" name="newCharacter.skillValues[speed]" required />


    <button type="submit">Save</button>

</form>

То в контроллере принимаете:

...

[HttpPost]

public IActionResult Create(CharacterModel newCharacter) {...}

...

Где вью-модель:

public class CharacterModel {

    public IDictionary<string, int> skillValues { get; set; }

}

раскрыть ветку (1)
Автор поста оценил этот комментарий

боюсь что ViewModel я не обладаю.


        [HttpGet]

public ActionResult CreateCharacter()

{

ViewData["Layout"] = "CreateCharacterLayout";

var races = cntx.GetDBContext().RaceGet.FromSql("EXECUTE dbo.RaceGet").OrderBy(el => el.PredefId).ToList();


return View(races);

}


[HttpGet]

public IActionResult CreateCharacter(int RaceSelect)

{


return View();

}


это контроллер, тестируя запросы через postman.

/CharacterCreate/CreateCharacter/?RaceSelect=125 - при таком виде запроса, я все равно попадаю на чертов первый Get )



Я говорю о том как принимать подобные значения:

    function GetSelectedParams()

{

var paramDict = [];

var raceSelect = document.getElementById("RaceSelect");

paramDict.push({ key: "RaceSelect", value: raceSelect.value });

return paramDict;

}


У странички нет ViewModel что наверное проблема, хоть я и не уверен )

показать ответы
2
Автор поста оценил этот комментарий

в целом я хорошо тут ориентируюсь.

Разумеется, пока тут 3,5 сущности) Когда их станет больше на порядок, это станет болью, но замечено будет только тогда, когда будет слишком поздно распутывать всю лапшу.


Могу посоветовать неплохую книжка Адама Фримана (https://smarly.net/pro-asp-net-mvc-4), которая неплохо демонстрирует основы трехслойной архитектуры, IoC/DI и TDD.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Не думаю что он настолько вырастет, функционал не такой жопный и амбиции тоже.


У меня другой вопрос, как настроить Routing от Action?

Вот есть у вас CreateCharacter/CharacterCreate в шаблоне [Controller]/[Action]

А вам надо впаять что-то вроде /?Race=5 - что делать в таком случае?


Сегодня разобрался с Get запросами и привязкой по URL.


Никак не могу сделать скрипт который будет набивать мне Dictionary параметров и отсылать этот Dictionary на сервак, не понимаю вообще реально ли это, как бы словарь он создает, да, но только как его потом раскрыть на стороне сервака?


var e = document.getElementById("ddlViewBy");

var strUser = e.options[e.selectedIndex].value; - вторая строка полная лажа и не работает, взял со стаковерфлоу, у всех взлетает у меня нет, чем заменить нашел но странно, ибо потерял порядка 4ех часов на эту чушь.


Get запрос пробросил, параметры - проблема. Фапался с httprequest и ajax.

В итоге тупо сделал get через jquery, жопа горит неимоверно.


Передавать через Data - смертоубийство.



За книгу большое спасибо.

показать ответы
Автор поста оценил этот комментарий

Кому как удобнее, я русскими не пользуюсь

раскрыть ветку (1)
Автор поста оценил этот комментарий

У нас не все в группе ориентируются в англе, поэтому русификация важна, да и вообще так удобней.

0
Автор поста оценил этот комментарий
Хм.. сам в таком же положении. Недавно по работе начал Асп.нет кор. И к днд приглядываюсь в качестве идей для домашнего проекта. Если нужна помощь и поддержка - могу влиться)
раскрыть ветку (1)
Автор поста оценил этот комментарий

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


Описаний и ТЗ нет, файлохранилище - могу слить на гитхаб как вариант.


Ну и если вы лучше рубите в организации веб MVC это будет очень кстати, ибо мне после более чем 2ух лет работы с WinForms крайне неудобно работать с мыслью что представление отделено от модели запросами )

показать ответы
Автор поста оценил этот комментарий

А что именно тебе должны сказать при выборе дварфа? Классовые абилки? Недостатки? Или что в компании в эльфийском лесу это будет не совсем уместный персонаж?

раскрыть ветку (1)
Автор поста оценил этот комментарий

классовые абилки, описание, плюсы к статам и т.д. и т.п.

Чем холмовой отличается от горного и т.п.

3
Автор поста оценил этот комментарий

Зачем вы добавляете суффиксы типов перечислений (...Enum)?

Да и разбивать по каталогам/неймспейсам таким образом стоит ли?


Вам, как программисту, важна абстракция. Сегодня это Enum, а завтра IDictionary, что потребует перемещения файлов, перетряхивания кучи кодобазы без весомого обоснования. Группировать лучше по слоям и логической общности.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Enum это Enum и дикшинари он не станет.

Проект мой и для меня, поэтому группирую как удобней мне, тут стандартов кода нет )


С нуля трудно выдать правильную группировку, в целом я хорошо тут ориентируюсь.


Логической общности тут достаточно.

показать ответы
0
DELETED
Автор поста оценил этот комментарий
Где сайт то сам ?
раскрыть ветку (1)
Автор поста оценил этот комментарий

localhost, какой смысл выкладывать недодел.

0
Автор поста оценил этот комментарий

А чем тебе не угодил билдер orcpub2, например?

Или дело именно в создании какой-то программы в новой для себя среде?

раскрыть ветку (1)
Автор поста оценил этот комментарий

+ там нет описаний, мол выберите расу, но нигде не сказано на что повлияет выбор дварфа и т.д. например.


Это очень раздражает.

показать ответы
0
Автор поста оценил этот комментарий

А чем тебе не угодил билдер orcpub2, например?

Или дело именно в создании какой-то программы в новой для себя среде?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Совмещаю приятное с полезным.


Чем не угодил - не полное описание.

Попробуйте собрать варлока у которого договор будет не с исчадием.


Из лучших билдеров только DnDBeyond за который нужно отвалить тысяч так 5, чтобы у него был нормальный выбор, в таком ключе я лучше сам напишу )

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества