Задать вопрос
  • Что опять не так с Git?

    sabramovskikh
    @sabramovskikh
    Идите спать, вам надо отдохнуть. А с утра взять переводчик и перевести "ошибку"
    Ответ написан
    Комментировать
  • Могут ли быть штрафы у фрилансера за не сдачу декларации 3-НДФЛ?

    Если по закону - то да, налоговая инспекция вправе предъявить претензии и потребовать уплаты налога за последние 3 года (срок давности) + выставить штраф в размере 100% от невыплаченной суммы.

    На практике, банки передают в финмониторинг сведения только о платежах от 600000 руб и о других сомнительных крупных платежах. Ваши выплаты на порядок меньше этой суммы.

    P.S. Если совсем по закону, то организация, заключившая с вами договор должна выступать в роли налогового агента, и самостоятельно вычитать и выплачивать подоходный налог от вашего имени.
    Ответ написан
    Комментировать
  • Как правильно вносить изменения в проект ASP.NET?

    petermzg
    @petermzg
    Самый лучший программист
    В Visual Studio есть кнопка "Publish..." и можно как задеплоить напрямую по IP адресу на сервер, так и создать zip пакет, который затем из IIS Manager можно развернуть.
    Ответ написан
    2 комментария
  • Что использовать для фиксирования багов?

    @pudovMaxim
    web-developer
    Я бы посоветовал засунуть багу в какое-нить выходное отверстие на вашем теле, но боюсь это не очень вежливо :)
    Почему так говорю? Потому что фразы вроде лень баг заводить, и кому нечем заняться говорит о неправильном отношении к процессу разработки. Если Вам лень оформить по-человечески баг и Вы его скидываете отпиской в слаку, то точно такое же отношение будет и разрабов, они просто не будут смотреть на такие ленивые записки кого-то там.

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

    По-хорошему должно быть одно место в конвейере разработки откуда нужно брать багу, а также одно место куда выдавать результат ее обработки.
    Ответ написан
  • Где осуществлять валидацию пользовательского ввода в архитектуре MVC?

    @Maa-Kut
    А где нужно, "по уму", закладывать проверки, что в числовое поле введено число? Где фильтруются sql-инъекции, HTML-разметку и прочие грязные хаки?

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

    Как распределена ответственность между частями системы в рамках архитектуры MVC в случае с толстым клиентом?

    Толстый JS-клиент можно сам по себе рассматривать как MV*-приложение. Серверная часть в этом случае становится моделью. При этом часть функций модели (скажем, некая базовая валидация) может быть реализована и на стороне JS; в конце концов, никто не говорит, что модель не может состоять из нескольких слоев.
    Ответ написан
    6 комментариев
  • Как сделать так, что бы краудфандинговые платформы сами рекламировали мой проект?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    наверно надо спросить у этих ресурсов?
    Ответ написан
    Комментировать
  • Что выбрать для автоматизации управления малым бизнесом?

    nki
    @nki
    bezkart.ru готовая система лояльности
    В вашем случае, я бы выбрал разработку системы на 1С с нуля.
    Вот разработки системы для компании с кучей хотелок, распределенными сотрудниками и пр.
    Ответ написан
  • 1C как изменить все значения одного столбца в таблице "Номенклатура"?

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

    Путь программиста. Нужно запросом отобрать не свойства ставки НДС из справочника номенклатуры, а ссылки на элементы справочника (с отбором на то, что это не группа). Далее по выборке из запроса по ссылке получаете объект, заменяете ставку НДС и записываете назад в базу. Выглядит примерно так:
    Запрос = Новый Запрос("Выбрать Ссылка Из Справочник.Номенклатура Где не ЭтоГруппа");
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Товар = Выборка.Ссылка.ПолучитьОбъект();
        Товар.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; 
        Товар.Записать();
    КонецЦикла;


    А что написали Вы?
    Вы отбираете свойства номенклатуры (скорее всего они у всех одинаковые = 18%) и далее работаете с массивом идентичной информации. Поскольку в вашей переменной Выборка находится ТаблицаЗначений, то значения поля СтавкаНДС1 вам с легкостью удается переопределить (бессмысленное занятие с учетом того, что после выполнения процедуры эта таблица будет удалена из памяти).
    Далее вызываете метод контекста Записать() - который определен внутри модуля объекта и модуля формы элемента для объектов данных. В случае работы внутри формы элемента справочника номенклатуры вам бы удалось записать текущий элемент, но вы скорее всего работаете в обработке и в ее контексте этого метода по-умолчанию нет - поэтому получаете ошибку.
    Ответ написан
    2 комментария
  • Я не умею готовить репозиторий или он просто не очень?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Коллеги, добрый день!

    Почему никто не упомянул про паттерн UnitOfWork? Паттерн репозиторий становится очень удобным в использовании, если:
    1. это паттерн GenericRepository;
    2. при необходимости можно добавить конкретные репозитории (я их называю ConcreteRepository;
    3. ну и конечно же, если всем этим управляет UnitOfWork;


    При использовании такой связки у Вас:
    • если много сущностей и есть GenericRepository, то вам не нужно плодить репозиторий на каждую сущность - достаточно сделать так: var unit = UnitOfWork.Repository<UserLog>();
    • пункт выше автоматически решает проблему "как выбрать данные из 2-3-4-... таблиц" - с репозиториями вы работаете как с DbSet в EF (кстати, сам DbContext из EF, по сути, реализует паттерн UnitOfWork и GenericRepository);
    • автоматически решается вопрос расширения вашего репозитория методами на каждый чих (т.е. надо получить список логов для конкретного пользователя - добавляем новый метод GetLogsByUserId в репозиторий) - не нужно накручивать репозиторий новыми методами, достаточно сделать так: var unit = UnitOfWork.Repository<UserLog>().GetQuery(e => e.UserId == targetUserId) или var unit = UnitOfWork.Repository<UserLog>().AsQuaryableQuery(e => e.UserId == targetUserId) (методы GetQuery и AsQuaryableQuery - это методы у сущности UnitOfWork, которые возвращают IEnumerable или IQueryable соответственно);
    • если методы SaveChanges/Commit реализованы в UnitOfWork (и UnitOfWork управляет транзакциями БД), то у вас решается проблема консистентности данных - UnitOfWork либо подтверждает все изменения (Commit), либо откатывает в случае ошибок (Rollback);
    Или мне спецальный класс завести в которомом сразу будут все репозитории(как dbContext прям)?

    Правильно мыслите - этот специальный класс и есть UnitOfWork. Он "прям как dbContext", только таким образом вы абстрагируетесь от всяких EF, NHibernate и прочих ORM. В итоге вашей бизнес-логике по барабану, какую ORM вы используете.

    Если мне нужен в 1 контроллере/сервисе не 1 репозиторий? мне по 1 их подключать? может мне 15 надо.

    Достаточно подключить 1 UnitOfWork (и лучше это делать через внедрение зависимостей - DI - DependencyInjection с использованием IoC-контейнера, например, Autofac, Ninject, Unity. Autofac лично мне нравится больше хотя бы потому, что у него самая адекватная и понятная документация, чем у Ninject и уж тем более Unity [нет, это не тема для холивара "кто лучше: Autofac/Ninject/Unity/... - это всё выводы из моего личного опыта]).

    И главный вопрос. Нужно ли вообще применять этот паттерн если ты не используешь юнит тестирование, либо не используешь его для покрытия 100% всего кода а только отдельные хелперы? Ведь для перехода на другую бд достаточно будет сменить провайдер если используешь ef, и если вы используете орм врядли вы полностью от неё откажетесь. Зачем писать кучу кода "наперед" с принципом "а вот вдруг мы поменяем бд/ос", да это скорей всего уменьшит изменения кода по сравнению с полной переписыванием проекта. Но если ты уверен что ос и бд не поменяется?

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

    СУБД менять - это не такая распространенная практика, а вот от ORM (и от EF в частности) отказываться в пользу производительности - это реальный кейс с ростом нагрузки.

    Толстый Лорри - абсолютно с Вами согласен по этому поводу.

    Михаил очень в тему упомянул принцип единственной ответственности. 1 компонент - 1 ответственность. По себе заметил - если следовать хотя бы этому принципу, то уже автоматически система становится модульной. А раз есть модули, то можно снизить степень связанности компонентов между собой, используя абстракции (интерфейсы и абстрактные классы). А раз есть абстрагирование между компонентами, то юнит-тестирование будет только в радость. Причем компонентом может выступать как класс, так и целый проект. Например, в отдельный проект можно вынести какой-нибудь модуль системы, и затем этот проект можно подключить в другую систему при разработке. Таким образом повышается степень повторного использования кода (зачем 2 раза делать одно и то же?).

    Михаил еще также указал в комментарии, в каких случаях репозиторий можно не использовать. Добавлю: в не-enterprise-решениях. Например, вы делаете какой-нибудь простенький сайт для себя. Или для друга. Или просто для изучения новой технологии.
    Ответ написан
    8 комментариев
  • На каких ресурсах искать работу в Великобритании?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Для специалистов от уровня mid и выше, проще искать не по аггрегаторам, а непосредственно по компаниями.
    Гуглим топ-10-20-30 сайтов контор, или можно нагуглить конкретно вам интересные конторы. Смотрим на их сайте вакансии.

    Не все вакансии скидывают на аггрегаторов, не все аггрегаторы вовремя обновляются.
    Ответ написан
    Комментировать
  • Как создать красивый UI под Android?

    @Skrolea
    Ответ написан
    Комментировать
  • Каков наиболее оптимальный подход к созданию ViewModel?

    @kttotto
    пофиг на чем писать
    Наверное я не совсем что-то понял... ViewModel обозначают модели, которые будут уходить во вьюшку, для отображения там информации. Зачем в одну вьюмодел инкапсулировать другую? Эти модели в основном содержат только необходимую инфу для вьюшки и никакой логики. Если в доменной модели Вам списки авто не нужны, то не стоит их там и делать. Нужно инициализировать вьюмодел нужным списком и эту модель отдавать уже вьшке. Вьюмодел инициализируется либо вручную доменной моделью, либо автомапером.
    Ответ написан
    4 комментария
  • Знания Junior php разработчика?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что должен знать идеальный джуниор (мое личное мнение):

    - Сетевой стэк. Нужно иметь хотя бы базовое представление о том как с сервером общаются. Ну то есть не нужно лезть в дебри, но понимать что такое HTTP или чем TCP от UDP отличается - нужно. В целом это пара часов чтения википедии.
    - GIT или любая другая распределенная VCS. Базовые навыки, что бы хотя бы понимал что есть git revert или git rebase, что такое фичабрэнчи и примерное представление как это работает и зачем надо.
    - Базовые основы unix. Ну то есть что бы не пугаться таких вещей как ssh хотя бы.
    - PHP. Без этого никуда. Он должен понимать что такое слабая динамическая типизация (не заучивать табличку кастов типов, а понимать плюсы и минусы, такая же история с приоритетами операторов - не заучивать а знать как избегать проблем с чтением кода)
    - Понимать что код чаще читают чем пишут, а потому не экономить 5 минут на написании кода, а писать так, чтобы сэкономить 30 минут человеку, разбирающемуся в куске кода.
    - Знать базовые вещи в плане безопасности. XSS и как защищаться, SQL инъекции и как защищаться, CSRF, MITM. Понимать что такое NDA, что данные пользователей - секретная информация. Как хэшировать пароли (не md5 а password_hash) и почему это важно.
    - Знать SQL. Глубоких знаний не требуется, нужно лишь понимание того, что такое нормальная форма, желательно разобраться с вопросом денормализации данных. Идеально иметь хотя бы базовые представления о том как работать с NoSQL решениями.
    - Процедурное программирование: почему глобальные переменные порождают сложность, что такое состояние, как можно использовать классы для изоляции состояния и т.д. Инкапсуляция. Инварианты, пост/пред условия, сохранение целостности...
    - Разделение ответственности. Это один из важнейших принципов, и упрощать все это до "mvc фреймворк" слегка неправильно. Вы должны понимать что от чего отделяете и главное зачем.
    - Автоматические тесты. Джуниор должен знать что это такое и иметь хотя бы минимальный опыт их написания. Должен понимать разницу между юнит и интеграционными тестами. Быть знакомым с пирамидой тестирования.
    - Уметь решать стандартные задачи не задавая слишком много вопросов. Например регистрацию пользователя по email-у вы должны написать, или авторизацию через соц сети, или комментарии, или новостную ленту.
    - Уметь дебажить. xdebug, blackfire и тд.

    В целом где-то за годик весь этот список можно влегкую покрыть с нуля.

    p.s. Я в списке специально не указывал ООП, поскольку всеравно первые пару лет у разработчиков выходит процедурщина на классах. Это не плохо, но того что в моем списке более чем должно хватать для решения стандартных задач. Но термины вроде "инкапсуляция/полиморфизм/наследование" требуются в обязательном порядке подавляющем количеством интервьюверов, а стало быть знать это надо. Единственное что - рекомендую в свободное время глубже погрузиться в этот вопрос а не тупо заучивать формулировки.

    Так же вещи вроде docker джуниорам знать не обязательно просто потому, что их врядли допустят сходу к управлению инфраструктурой. А так пару неделек на изучение и вперед.
    Ответ написан
    12 комментариев
  • Что учить ASP.NET MVC 5 или ASP.NET Core?

    SuccessVM
    @SuccessVM
    Программирование - творчество
    ASP.NET 5 и ASP.NET Core, это одно и то же, просто Core более позднее название.

    Вот перевод - ASP.NET 5 мертв — представляем ASP.NET Core 1.0 и ....

    Что же касается изучения технологии, то лучше исходить из конкретного проекта и задач, которые будет решать проект. Если это проект, который необходимо поддерживать и он построен на ASP.NET MVC 4, то именно этот подход и изучай. Если же требуется создать новый проект и в качестве сервера выбрана операционная система Linux, то тут выбор может быть за Core или Mono.

    ASP.NET Core - это тренд, изучая его сейчас, можно быть уверенным в будущих заказах или работе, постепенно всё будет стремиться к кроссплатформенности, это же захват новых рынков, ты только представь, сколько специалистов по C#/VB.NET уже существует.

    Если говорить об отличиях, то они безусловно есть, например встроенный DI контейнер или нюансы, касающиеся самой платформы, но если ты уже знаком с ASP.NET MVC 4, то будешь чувствовать себя, как рыба в воде.

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

    UPD. 07/10/2016

    Ещё по теме интересная статья от 25 мая 2016 года, перед конференцией DotNext в Санкт-Петербурге - ASP.NET Core сегодня: за и против
    Ответ написан
    4 комментария
  • Как поднять себе зарплату?

    denisgorbunovmsc
    @denisgorbunovmsc
    руковожу проектным офисом
    Надеюсь подчиненные не прочитают.

    1) Вежливое слово с пистолетом в руке лучше, чем просто вежливое слово.
    Выходи на рынок. Имея на руках job offer с текущей з-п и более интересной работой, или большей з-п и менее интересной ты скорее получишь прибавку, или изменение условий труда.
    Чтобы найти работу работает некий рубеж перехода количественного в качественное: чтобы получить одно интересное предложение нужно сходить на 10 собеседований, чтобы сходить на одно собеседование нужно откликнуться на 10 вакансий. Это для невезучего чеовека, для везучего будет не 10, а 5 или менее.

    2) Самопиар и глубокая специализация. О том, что ты стал больше делать люди должны знать и нужно закрепить за собой какую-то проф. нишу внутри коллектива - что-то что ты делаешь сильно лучше коллег. Это могут быть разные аспекты. Здесь получаем ценность и ответ на вопрос почему ты должен получать больше коллег.
    Зачастую бывает, что окружающие не замечают роста у коллег, так как все сосредоточены на себе.

    3) Разговор с начальством и обозначить свои ожидания. Возможно, с этого стоило бы начать, если не кризис. Ну и чем меньше компания тем важнее становится это (отношения), а не первое. Очень часто бывает, что у человека есть недовольство текущим положением, он идет в первый вариант, а из первого варианта его очень сложно вернуть, так как он себе уже наворотил причин для ухода и распутать этот клубок одними деньгами не получается.

    Это часто бывает с переездом в Москву. Изначально люди готовы ехать на маленькие деньги, чтобы "закрепиться". Снимают жилье подешевле и затягивают пояса. Через полгода запасы, с которыми приехали истощаются, а в пути 3-4 часа каждый день + 10+ часов на работе высасывают все энергетические запасы. Тут уже человек начинает себе кроме з-п придумывать еще поводы: начальник чудак, коллеги лодыри, место у окна дует и прочие моменты, на которые в нормальном состоянии ему пофиг. Деньги далеко не единственный мотиватор и в такой ситуации с них все начинается, но паровозом человек себе достраивает еще ворох причин.
    Новое место как и новая жена, если старая достала, всегда кажется лучше. Человек находит новое место с большей зарплатой и уже на прежнюю з-п он не останется в прежней конторе. И оставлять его проблематично, так как есть ворох проблем и либо уходить в психоанализ на полгода с решением этих диссонансов, либо прежней любви и энергии уже не будет. Это практически неразрешимая ситуация, которая началась с нехватки 15-25 тысяч рублей в текущем окладе.

    4) Самый пассивный сценарий - ждать хорошей погоды. Умный начальник будет повышать подчиненного, даже если тот не растет, а уж если растет, то и подавно. Почему он это делает? Потому что бегать и выбивать деньги, чтобы удержать - всегда на порядок сложнее и менее эффективно. Если не повышают, то может и первый вариант не так плох, так как и 2й и 3й варианты не всем подходят, ибо требуют большой доли экстравертности.
    Ответ написан
    Комментировать
  • Как поднять себе зарплату?

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

    Руководство прикидывает - а стоит ли твоя квалификация и выполняемые обязанности повышения или дешевле другого найти.

    Если ты действительно стОящий специалист - получишь повышение.

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

    Бояться нечего. Даже если откажут ничего с тобой плохого не случится - все вернется на круги своя.

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

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

    Очень многие вещи можно решить простым вежливым спокойным разговором.

    Весь бизнес на этом строится. Бизнесмены только и делают целыми днями, что разговаривают. Поговори с директором - для него разговоры это обычная часть работы.
    Ответ написан
    Комментировать
  • Как обработать все ошибки (перехваченные и неперехваченные) в ASP.Net MVC?

    andrewpianykh
    @andrewpianykh
    Я предпочитаю следующий подход:

    1. Создаем контроллер ErrorController, например так:

    public class ErrorController
    {
    	public virtual ActionResult BadRequest()
    	{
    		return View();
    	}
    
    	public virtual ActionResult Forbidden()
    	{
    		return View();
    	}
    
    	public virtual ActionResult Index()
    	{
    		return View();
    	}
    
    	public virtual ActionResult NotFound()
    	{
    		return View();
    	}
    }


    2. Добавляем вьюхи

    3. Создаем свой расширенный HandleErrorAttribute, например так:

    public class ExtHandleErrorAttribute : HandleErrorAttribute
    {
    	//private readonly ILogger logger;
    
    	public ExtHandleErrorAttribute(/*ILogger logger*/)
    	{
    		//this.logger = logger;
    	}
    
    	public override void OnException(ExceptionContext filterContext)
    	{
    		if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
    		{
    			return;
    		}
    
    		if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
    		{
    			return;
    		}
    
    		if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
    		{
    			return;
    		}
    
    		if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    		{
    			filterContext.Result = new JsonResult
    			{
    				JsonRequestBehavior = JsonRequestBehavior.AllowGet,
    				Data = new
    				{
    					error = true,
    					message = filterContext.Exception.Message
    				}
    			};
    		}
    		else
    		{
    			var controllerName = (string)filterContext.RouteData.Values["controller"];
    			var actionName = (string)filterContext.RouteData.Values["action"];
    			var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
    
    			filterContext.Result = new ViewResult
    			{
    				ViewName = View,
    				MasterName = Master,
    				ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
    				TempData = filterContext.Controller.TempData
    			};
    		}
    
    		//var e = filterContext.Exception;
    		//logger.Error(e, e.Message);
    
    		filterContext.ExceptionHandled = true;
    		filterContext.HttpContext.Response.Clear();
    		filterContext.HttpContext.Response.StatusCode = 500;
    		filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    	}
    }


    4. Регистрируем глобальный фильтр:
    public class FilterConfig
    {
    	public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    	{
    		var extHandleErrorAttribute = DependencyResolver.Current.GetService<ExtHandleErrorAttribute>();// new ExtHandleErrorAttribute();
    		filters.Add(extHandleErrorAttribute);
    	}
    }


    5. В Global.asax.cs добавляем метод Application_Error:

    protected void Application_Error(object sender, EventArgs e)
    {
    	var httpContext = ((MvcApplication)sender).Context;
    
    	var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
    	var currentController = " ";
    	var currentAction = " ";
    
    	if (currentRouteData != null)
    	{
    		if (currentRouteData.Values["controller"] != null && !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString()))
    		{
    			currentController = currentRouteData.Values["controller"].ToString();
    		}
    
    		if (currentRouteData.Values["action"] != null && !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString()))
    		{
    			currentAction = currentRouteData.Values["action"].ToString();
    		}
    	}
    
    	var ex = Server.GetLastError();
    
    	var controller = new ErrorController();
    	var routeData = new RouteData();
    	var action = "Index";
    
    	if (ex is HttpException)
    	{
    		var httpEx = ex as HttpException;
    
    		switch (httpEx.GetHttpCode())
    		{
    			case 404:
    				action = "NotFound";
    				break;
    
    			case 403:
    				action = "Forbidden";
    				break;
    
    			case 400:
    				action = "BadRequest";
    				break;
    
    			default:
    				action = "Index";
    				//var logger = DependencyResolver.Current.GetService<ILogger>();
    				//logger.Error(ex, ex.Message);
    				break;
    		}
    	}
    
    	httpContext.ClearError();
    	httpContext.Response.Clear();
    	httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
    	httpContext.Response.TrySkipIisCustomErrors = true;
    	routeData.Values["controller"] = "Error";
    	routeData.Values["action"] = action;
    
    	controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction);
    	((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
    }


    6. В web.config добавляем в system.web
    <customErrors mode="On" />

    также в system.webServer можно добавить:

    <httpErrors>
      <remove statusCode="400" subStatusCode="-1" />
      <remove statusCode="403" subStatusCode="-1" />
      <remove statusCode="502" subStatusCode="-1" />
      <remove statusCode="501" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="400" prefixLanguageFilePath="" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="404" prefixLanguageFilePath="" path="/Error/NotFound" responseMode="ExecuteURL" />
      <error statusCode="500" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="501" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="502" prefixLanguageFilePath="" path="/Error" responseMode="ExecuteURL" />
      <error statusCode="403" prefixLanguageFilePath="" path="/Error/Forbidden" responseMode="ExecuteURL" />
    </httpErrors>
    Ответ написан
    Комментировать
  • Как на лету добавлять столбцы в базу данных?

    @dmitryKovalskiy
    программист средней руки
    А что вы понимаете под "на лету"? Реакция на некое действие пользователя? Для 99,9% случаев - такое поведение не нужно. Нужно чуть чуть пересмотреть задачу и сделать без добавки столбцов. БД - вещь в высокой степени статичная должна быть. Исходя из этого можно заниматься ее оптимизацией работы.

    Ну а если вы хотите накатывать обновления без остановки приложения, то банального ALTER TABLE вам должно хватить.
    Ответ написан
    2 комментария
  • Как вернуть мотивацию к обучению?

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