Ответы пользователя по тегу ASP.NET
  • Пoдскажите базовые правила работы с миграциями в asp.net?

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

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

    Процесс "приведения в порядок" можно закриптовать, поэтому сильно большой проблемой это не должно быть.
    Ответ написан
  • Как сделать обновление миграции EFCore?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    При каждом изменении моделей и/или их связей, нужно сначала сгенерировать очередную миграцию (Add-Migration), а затем - накатить изменения на схему (Update-Database).

    В CLI будет так:
    dotnet ef migrations add NewMigrationName;
    dotnet ef database update;


    Подробнее читать тут.
    Ответ написан
  • Добавление записей в доп. таблицу, имеющей связь с основной таблицей?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    var newPerson = new People {
       //Id = model.Id,
       Name = model.Name,
       Treatment = new Treatment {
            //...
       },
    };
    
    dbCcontext.People.Add(newPerson);
    dbCcontext.SaveChanges();
    Ответ написан
  • Как в представлении Create/Update задать не ID связной сущности а поле Name?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Конструктор SelectList имеет сигнатуру :
    public SelectList (System.Collections.IEnumerable items, 
                       string dataValueField, 
                       string dataTextField,
                       object selectedValue);

    Поэтому вторым параметром необходимо указать имя свойства для значений элементов option:
    new SelectList(_context.Department, 
                   nameof(Department.DepartmentID), 
                   nameof(Department.Name), 
                   person.DepartmentID);
    Ответ написан
  • Нелогично работают теги в Razor?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Дело не в razor, а в том, что вы заведомо пишите невалидную разметку. Как должен браузер обрабатывать клик по внутренней ссылке? Игнорировать ее или внешнюю? Он, вероятно, что-то все же сделает, но не факт то, что вы ожидаете. А парсер разметки в Razor считает, что лучше вот так интерпретировать.

    Судя по тому, что на внешней ссылке (catalog-item) нет аттрибута "href" (он обязателен), вам она нужна лишь для руки-указателя. Того же эффекта можно добиться с div:
    .catalog-item:hover { cursor: pointer; }
    Ответ написан
  • Кто может разжевать асинхронные контроллеры?

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

    В десктопных приложениях в основном потоке есть Главный Цикл (event loop), который в свободное от обработчиков время перемалывает очередь сообщений окна (дёргает эти самые обработчики в ответ на соответствующие события, вроде нажатия кнопок). Если обработчик попался слишком жирный, то сообщения не обрабатываются - окно перестает реагировать на сообщения.

    В вебе (ASP.NET) же каждому новому запросу выделяется новый поток. Если запросы выполняются слишком медленно, а клиенты поступают и поступают, то есть риск исчерпать thread pool. Как правило, самые медленные действия - это ввод-вывод, при которых поток нашей программы ничем не занят, кроме ожидания. Но операционные системы могут делать асинхронный ввод-вывод (сигналить, когда данные были прочтены/записаны), так почему бы нам не вернуть напрасно простаивающий поток в тредпул? А когда данные считаются - мы выделим поток и вернемся к задачке.
    Ответ написан
  • Как создать POST запрос без нажатия кнопки?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Вызвать вручную событие формы
    document.querySelector('form').submit();

    или же POST-запрос с помощью ajax (XMLHttpRequest)
    Ответ написан
  • Как добавить Partial View к основной странице?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Partial Views (и вообще средства Razor) - это серверный рендеринг, тут ни о каких щелчках по кнопкам речи не идет. Здесь решения может быть в общем случае два:
    1. рендерить с display: none, а при щелчке менять стиль (JS или :checked в CSS )
    2. рендерить на клиенте, уже фактически изменяя DOM
    Ответ написан
  • Как правильно возвращать ошибки из контроллеров ASP NET MVC 5?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Рассмотрите еще фильтры, как точку перехвата исключений.

    Обычно возвращаемая вебная API-модель выглядит примерно так:
    {
        "isSuccess": true,
        "errorCode": 0,
        "errorMessage": null,
        "skip": 0,
        "take": 1,
        "data": {...}
    }

    Данные в нее заворачиваются (поле data).

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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Можно попытаться разбивать файл на чанки и их поэтапно отправлять разными запросами.
    Ответ написан
  • В чём существенные преимущества и недостатки ASP.NET core MVC перед PHP и его фреймворками?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1)Насколько сложно изучать ASP.NET core MVC?

    Нужно как минимум знать C# и английский язык (документация не переведена). Сложно или нет - вопрос спорный, ибо нужно знать еще некоторые смежные технологии. Так что вкатиться с нуля сразу в веб не выйдет.

    2)Насколько он быстр в высоконагруженных проектах?

    Достаточно быстр.

    3)Насколько дорого создавать приложения на нём?

    Индивидуалу или организации? Первому - бесплатно, второй - не дешевле, чем на Java. Для мелких приложений - дороже, чем на PHP, на крупных - дешевле.

    4)Стоит ли вообще его где-либо применять,если есть быстрые и удобные PHP фреймворки?

    Навырост, например. Но зачем применять PHP, если есть ASP.NET Core? Ответ: сейчас вокруг бегает много дешевых PHP-разработчиков, которые нагенерили достаточно много говнокода, правкой которого можно заниматься на фрилансе.

    5)Какие есть существенные недостатки?

    Пока еще слабо развита экосистема (в сравнении с Java). Но технология сейчас стабильно становится все популярнее.
    Ответ написан
  • Пишу таск-менеджер на ASP.NET. Как реализовать подсчёт времени выполнения задачи?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Не нужно хранить в базе ActualPerformanceTime, т.к.
    1. значение будет пересчитываться при каждом новом запросе
    2. оно должно допускать разрывы (паузы)

    Можно каждой таске сопоставить таблицу один-ко-многим с временными отрезками:
    class MyTimeSpan {
        public int Id { get; set;}
        public DateTime From { get; set; }
        public DateTime? To { get; set; }
    
        public int TaskId { get; set;}
        public Task Task { get; set;}
    }

    При старте MyTimeSpan.To остается null, при Stop или Pause - отрезок "закрывается". Если хоть один отрезок не закрыт, то таска находится в прогрессе (Task.TaskStatus не нужен. Тем более, что название свойства - тавтология).
    Ответ написан
  • Как из БД вытащить файл?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Имеющий руки да загуглит!

    public ActionResult Index()
    {
        byte[] contents = GetPdfFileData();
        return File(contents, "application/pdf", "test.pdf");
    }
    Ответ написан
  • Как заменить блок html текста?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    то есть экранируются двойные кавычки...

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

    Вы уверены, что здесь правильно используется StringBuilder? Сейчас от него нет толка, ибо на каждой итерации цикла он возвращает и записывает строку, которая станет ненужной на следующей итерации, т.е. память все равно забивается, аллокации происходят. Какая-то преждевременная оптимизация.

    Убедитесь, что он заменяемое значение действительно там содержится. HtmlAgilityPack вполне может оптимизировать HTML (тот, который из OuterHtml), скажем, вырезать пробелы и/или переводы строки.
    Если вы работаете с DOM-парсером, то нужно не изобретать велосипеды, а пользоваться его API:
    string htmlTag = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode( htmlTag );
    img.ParentNode.ReplaceChild(newNode, img);
    Ответ написан
  • Вопрос по требованиям к реализации?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1) Использовать файл конфигурации приложения для User-specific настроек

    Рядом со сборкой (MyApplication.exe или MyApplication.dll) можно положить XML-файл настроек (MyApplication.config), который будет влиять на конкретный экземпляр сборки. Можно почитать об этом у Рихтера (в главе про разветывание сборок) или в документации, там же есть XML-схема.
    Кроме того, такой Web.config файл есть у каждого ASP.NET-приложения (а у десктопного - App.config) на уровне проекта (не путать с Web.config в папке Views)

    2) Использовать ресурсы для хранения UI-строк

    Все видимые пользователю строковые ресурсы в приложениях принято оборачивать заменять на локализованный эквивалент. Это может быть сервис, в который подставит нужные значения, в зависимости от настроек приложения/языка пользователя и т.п. Грубо говоря, словарь терминов, который выбирает значения из таблицы по значению. Используется что-то вроде:
    <h3>@Localization.Get("Contacts_PageHeader")</h3>
    Извлекать значения, соответственно, из ресурсов.
    Ответ написан
  • Как соединить выбранное значение DropDownList с @Url.Action?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    HTML-формы, либо с помощью js изменять параметры GET-запроса.
    Ответ написан
  • В чем удобство html хелперов перед в asp.net перед обычной html разметкой?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Возможность кастомизировать эдиторы для отдельных вьюх. Иногда это просто лучше выглядит, чем генерация HTML руками (те же дропдауны). Для всего остального - просто общая консистентность с типизированными хэлперами.

    Хотя, зачастую их вообще избегают в пользу мелких вкраплений в HTML и PartialViews. Тем более, что ASP.NET Core уже идет по классическому пути шаблонизаторов - использует специальные аттрибуты (TagHelpers).
    Ответ написан
  • Как формировать таблицу html с изменяющимся набором данных?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Не смешивайте верстку и логику! В идеале все вычисления должны проиходить до вызова вьюхи (в контроллере, сервисе и т.п.), а во вьюху должна приходить уже готовая вью-модель, данные которой останется лишь расставить в нужные места верстки.

    Цикл for был бы симпатичныее в виде foreach, без этого .ElementAt(j)

    ЗЫ rowspan
    Ответ написан
  • Как правильно писать Unit Test к ASP.NET MVC?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Нужно настраивать моки. Они по умолчанию возвращают default-значение требуемого типа. Таким образом внутри AddCategory мок репозитория всегда дает result == null и, соответственно, null возвращается, тест падает.

    var model = new CategoryModel { ... };
    
    var categoryModelRepository = new Mock<ICategoryModelRepository>();
    
    categoryModelRepository.Setup(x => x.AddCategory(model))
                                                .Returns(model);
    // Или
    categoryModelRepository.Setup(x => x.AddCategory( It.IsAny<CategoryModel>() ))
                                                .Returns(model);
    
    // Act...
    
    Assert.IsNotNull(result);
    Ответ написан
  • Немного о способе изучении asp.net mvc?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    ИМХО, стоило бы изучать с Шилдта или Троелсена. Там язык подается в чистом виде, с консольными примерами, без заморочек с GUI в самом начале. XAML в вебе не нужен (ибо Silverlight, где он использовался, не особо жив), это правда.

    Для ASP.NET MVC нужен HTML/CSS и базовый SQL (ORM в виде EF есть, да, но гораздо легче ею овладевать, зная, как она общается с сервером). JavaScript можно учить параллельно. С ангуляром я бы советовал повременить, вместо него jQuery (что бы хипсторы не говорили, он сейчас почти везде).

    Вообще, идеально было бы распараллелить изучение C# в глубину (по Рихреру, например), баз данных и DAL (ORM - EF), ASP.NET MVC и веб-фронтенда, ибо в изоляции друг от друга сложнее.
    Смотреть на ASP.NET Core новичку сейчас есть смысль лишь если нет другого компьютера, кроме мака.

    На Git выделять в отдельный шаг - это слишком. Базовые операции с Git можно изучить за вечер, по необходимости дочитывать в процессе, может еще пару вечеров факультативно выделить на "internals". Вообще необходимость в нем появится, когда будешь делать первый крупный pet-проект (то есть это где-то в процессе освоения ASP.NET MVC).

    не могли бы вы посоветовать книги для изучения С# имено под веб ?

    Адам Фриман "ASP.NET MVC X для профессионалов"
    В продаже есть версия про MVC 5, но версия от версии отличается не слишком критично, поэтому и для 4 пойдет для начала. Это книжка уже чисто про веб-фреймворк, кое-что про сишарп там обзорно и лишь в самом начале, читать ее нужно уже изучив базу языка. Кроме того автор там пишет про паттерны (пресловутый MVC и его историей развития), техники написания юнит-тестов и внедрения зависимостей (IoC/DI). Книжка мегакрутая для новичка, но достаточно непростая, требует обдумывания и на некоторое время может стать настольной.
    Ответ написан