Ответы пользователя по тегу 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();
    Ответ написан
    5 комментариев
  • Как в представлении 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);
    Ответ написан
    1 комментарий
  • Нелогично работают теги в Razor?

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

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

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

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

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

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

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

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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Можно попытаться разбивать файл на чанки и их поэтапно отправлять разными запросами.
    Ответ написан
    Комментировать
  • Пишу таск-менеджер на 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");
    }
    Ответ написан
    2 комментария
  • Как заменить блок 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);
    Ответ написан
    7 комментариев
  • Немного о способе изучении 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). Книжка мегакрутая для новичка, но достаточно непростая, требует обдумывания и на некоторое время может стать настольной.
    Ответ написан
    Комментировать
  • Asp Net MVC, гд лучше размещать запросы к БД?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Обычно приложения делят на три слоя:
    • Data Access Layer
    • Business Logic (Domain models)
    • UI (Web).


    BL независим, DAL зависит от BL, UI зависит от DAL и BL (ибо там располагается интерфейсы биндятся на реальные классы).

    Если мы рассматриваем классическую схему доступа к данным через репозитории, то:

    BL содержит: доменные модели, интерфейсы для репозиториев, сервисы (интерфейсы и реализации, которые работают с репозиториями).
    DAL содержит: реализации интерфейсов репозиториев (из BL), т.е. работу с DB, DbContext (от EF) и прочую конкретику о том, откуда и каким образом извлекаются данные.
    UI (для ASP.NET MVC) содержит: собственно веб-проект с котроллерами *Controller.cs (Controllers), вьюшками *.cshtml (Views), вью-модели *.cs (Models, те специфические модели, которыми типизируются вьюхи, они могут отличаться от доменных (маппиться с них в контроллере), например, содержать объект с данными пагинации).

    Также UI сожержит корень внедрения зависимостей, где связываются между собой интерфейсы и их реализации, например, интерфейсы репозиториев из BL и реализации (заточенные на работу с БД) из DAL.

    Пример реализации.

    ЗЫ Азы такой архитектуры применительно к ASP.NET MVC есть в замечательной книжке Фримана.
    Ответ написан
  • Какое направление лучше выбрать при изучении c#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1) С# или Visual C#?

    Где вы прочитали это? В природе бывает лишь C# и он описывается стандартами. Visual %LANG_NAME% обычно Microsoft называет свои версии Visual Studio, заточенные под конкретную технологию. Но язык все равно С#.

    2) Что такое платформа .NET Framework?

    Это как бы...фреймворк) То есть вся та среда, в которой исполняется ваша программа, включая виртуальную машину (CLI) и библиотеку стандартных классов (FCL). То есть скомпилировав свое приложение, вам его нужно этой среде передать и она гарантирует наличие всего необходимого, чтобы приложение выполнилось. Пишет о нем отлично местный гуру - Джефри Рихтер в "CLR via C#". Странно было бы, если учебники, скажем, по JavaScript вплотную рассматривали бы V8, правда?)

    3) Недавно прочитал про .NET CORE.

    Это альтернативная реализация .NET Framework. Оно иначе работает и FCL там построена иначе. Но C# там точно такой же, как и на "большом" фреймворке, так что начав учить его вы ничего не потеряете. А уж MS позаботится, чтобы их сопутствующие технологии тоже не сильно отличались (ASP.NET MVC от ASP.NET Core, EntityFramework от EntityFramework Core.

    Вывод: если вы только начинаете, то вам без разницы, хоть под Core, хоть под .NET Framework, язык там один и тот же, консольные приложения такие же. Просто некоторые классы переехали в отдельные сборки. С нуля же лезть в фреймворки (ASP.NET MVC/Core, WPF, EntityFramework (без знания ADO.NET)) - рановато, освойтесь с самим языком, базовыми библиотеками.
    Ответ написан
    2 комментария