Задать вопрос
  • Как обработать все ошибки (перехваченные и неперехваченные) в 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>
    Ответ написан
    Комментировать
  • Как писать тесты в asp.net mvc не затрагивая Entity Framework?

    @Sing303
    Вариант 1:
    Использовать неограниченные фреймворки, на подобии Typemock, он позволит подделывать что угодно, приватные и статические методы

    Вариант 2:
    Использовать репозиторий. Необходимость использовать Typemock говорит о том, что код "плохо пахнет" и в нём явно что-то не так.
    Ответ написан
    Комментировать
  • Как писать тесты в asp.net mvc не затрагивая Entity Framework?

    Nipheris
    @Nipheris Куратор тега C#
    Как мокать EF не используя не нужный слой абстракции с репозиторями таким образом чтобы весь функционал EF оставался рабочим?

    Может, не такой он уж он не нужный? Репозиторий нужен в том числе для того, чтобы иметь четкий список методов для тестирования. Я сейчас вообще не могу толком понять, что вы тестируете.
    Ответ написан
    Комментировать
  • Проверка условий на буквы?

    amf1k
    @amf1k
    Читайте про регулярные выражения
    Ответ написан
    Комментировать
  • Как перевести число в строку без потери формы?

    Если задача именно избавиться от экспоненциальной формы, то подойдет такое решение
    string formatted = String.Format("{0:F20}", value);
    Ответ написан
    Комментировать
  • Чем отличается onion-architecture от n-layer-architecture?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    n-layered архитектура - это просто архитектура построенное на рандомном количестве слоев. оно определяет базовые принципы разделения ответственности и все такое, но на этом все.

    onion - тут уже идет уточнение, что мол в самом сердце у нас core-domain, сущности, базовые бизнес правила. От него уже идет дальше domain layer, application layer и т.д. То есть сначала мы проектируем core-domain а потом уже все остальное.

    Есть еще гексагональная - это опять же уточнения для n-layered архитектур, что мол каждый слой отделен друг от друга за счет dependency inversion. На границах слоев всегда есть интерфейсы, а у внешнего слоя - реализация. Потому ее называют "архитектура портов и адаптеров".
    Ответ написан
    2 комментария
  • Каким образом с технологией ASP.NET MVC соотносятся языки программирования С# и VB.NET?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    У веб приложения есть две части - клиентская и серверная. Клиентская - это веб страничка, которую пользователь видит в браузере. Серверная - это то, что генерирует на сервере эти странички, которые загружаются у пользователя на клиенте (в браузере).

    Клиентская часть - это HTML, CSS и JavaScript - то бишь те технологии, которые используются для создания обычных веб страниц. При этом на сервере могут быть использованы очень разные стеки технологий. В частности для стэка .NET - есть IIS (веб-сервер для хостинг-серверов на базе Windows), на котором работает ASP.NET (это веб фреймворк для генерации веб страниц) с использованием языка программирования С# или VB.NET.

    Пример другого стека на сервере: веб-сервер Apache (обычно на хостинг сервере на базе Linux), на котором работает скажем веб-фреймфорк CakePHP с использованием языка программирования PHP.

    Еще один пример: веб-сервер Passenger (на хостинг сервере под управлением операционок семейства Unix), на котором работает веб-фремворк Ruby on Rails, где разработку вы ведете на языке программирования Ruby.

    Есть подобные серверные комбинации для других языков программирования - Python, Java и тп.

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

    Например, для языка программирования PHP есть много разных веб фреймворков. Для других языков - тоже. Даже для языков С# и VB.NET есть ASP.NET WebForms (раньше его наывали просто ASP.NET) и ASP.NET MVC (сюда же я бы отнес вариацию фреймворка для создания API - Web API). Для многиэ стэков есть много разных веб-серверов, веб-времворков и соответственно можно использовать много вариантов связок ОС - ВС - ВФ - ЯП

    На счет "Пишем сайт на VB.NET" это скорей всего значит - пишем на VB.NET веб приложение, которое будет использовать один из веб фремворков (либо ASP.NET WebForms либо ASP.NET MVC).

    Надеюсь, мне удалось внести ясность в терминологическую кашу, окружающую нас. К сожалению, даже в википедии я часто вижу эту кашу и кто-то начинает называть ASP.NET языком программирования. Это не так.
    Ответ написан
    7 комментариев
  • Как правильно выбрать архитектуру приложения?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Архитектор, это обычно выше уровня senior, поэтому в книгах не будет указано на сколько слоев нужно делить и какой паттерн выбрать для вашего приложения.

    Будут другие примеры, а с опытом вы научитесь подбирать наиболее подходящие, чаще всего набив шишки.
    Ответ написан
    Комментировать
  • Какова роль Autofac в WPF приложениях?

    @SZolotov
    Asp.net core, MAUI,WPF,Qt, Avalonia
    IoC, DI гуглите.
    Ответ написан
    Комментировать
  • Android клиент и C# сервер. Правильно организовать?

    @dmitryKovalskiy
    программист средней руки
    На C# есть веб-фреймворк ASP.NET и его компонент WEB API. Пара несложных телодвижений и он вернет то что у него попросят ( спросят xml - вернет xml, аналогично json).
    Ответ написан
    Комментировать
  • Как с помощью Webpack с CommonsChunkPlugin разделить код по страничным бандлам?

    @Roman_Kh
    Потому что vendor не должен быть в entry, если вы хотите, чтобы он стал единой сборкой общего кода.

    А вообще, лучший туториал по Webpack - https://www.youtube.com/playlist?list=PLDyvV36pndZ... - с разнообразными примерами и подробными пояснениями.
    Смотрите видео с 3.1 по 3.6 - это займет 20 минут, зато все станет понятно.
    Ответ написан
    7 комментариев
  • Что даёт владение компьютером (планшетом, смартфоном) в плане развития ребёнку?

    @moozooh
    Chief Technical Grammar Nazi
    У меня свой компьютер появился в 15 лет, и сейчас обе моих профессии неразрывно связаны со знаниями, которые я приобрёл в ходе своей работы с компьютером. Но ещё задолго до того, как он появился, я игрался с конструкторами, учил английский в школе и дома, много читал, и среди моих любимых книг детства были «Почемучка», «Твоё свободное время», БСЭ, мифы и сказки разных народов, жюльверны-даррелы-азимовы, географические атласы и всякий научпоп. Прошло много лет, и я использую компьютер и планшет для самообразования, смотрю на них кино и читаю книги, ежедневно узнаю что-то новое из мира науки и техники, толерантно и с интересом отношусь к другим культурам, продолжаю расширять кругозор, говорю по-английски и регулярно езжу бродить по горам.

    Понимаете, к чему я клоню, да? Это такой тонкий намёк™ на то, что в плане развития компьютер/планшет/смартфон даёт человеку ровно то же самое, что человек делал до него или без него — просто более эффективно и в большем количестве. А если ребёнок на этих устройствах занимается только фигнёй, то это проблема не компьютера, и даже не ребёнка, а родителей, которые в первые несколько лет жизни не смогли должным образом удовлетворить его любознательность и заставить мозг работать.
    Ответ написан
    Комментировать
  • Что даёт владение компьютером (планшетом, смартфоном) в плане развития ребёнку?

    @Alcospb
    Кругозор и объем знаний развивается не за счет времени проведенного перед монитором, а за счет действий, которые предпринимает индивидуум.
    Аналогично, ваши мышцы не станут сильнее от сидения в качалке, как и мозги эффективнее от чтения анекдотов.
    Ответ написан
    Комментировать
  • Что даёт владение компьютером (планшетом, смартфоном) в плане развития ребёнку?

    @jackroll
    Сверхразум
    Спросите у себя, почему имея доступ к интернету ваши знания не растут в геометрической прогрессии.

    p.s вы требуете от ребенка слишком многого. Природа создавала человека не для того, чтобы он складывал числа или программировал на java.
    Ответ написан
    3 комментария
  • Что даёт владение компьютером (планшетом, смартфоном) в плане развития ребёнку?

    vawsan
    @vawsan
    Frontend Developer
    Если он там кидает птичек в хрюшек, то ничего не дает.
    Если читает, иногда смотрит кино, какие-то обучающие программы использует - то аналогично работе за компом.
    Ответ написан
    Комментировать
  • Как пощупать рынок, и спрос к стартапу?

    nki
    @nki
    bezkart.ru готовая система лояльности
    >>>советует что надо для предварительного анализ создать сайт и заказать рекламу
    Для начала создайте портрет/профиль вашего потенциального пользователя. Поймите, что реклама в интернете - это один из каналов привлечения и не факт, что ваша целевая аудитория активно пользуется этим каналом.
    Я бы на вашем месте лично бы пообщался с возможными пользователями. Узнал бы актуальна ли для них проблема, которую решает ваше приложение, готовы ли они платить за него и т.д.
    Не зацикливайтесь на интернете - побольше живого общения. Посетитель вашего сайта просто закроет его, а собеседник может рассказать, что ему не хватает и что он ожидает от подобного продукта.

    Успехов в ваших начинаниях.
    Ответ написан
    6 комментариев
  • Какие действия необходимы в направлении продвижения сайта?

    Я бы попробовал пойти по следующей схеме:
    1) У меня есть сайт
    2) Для чего мне сайт? (люблю делиться мыслями, хочу что-то продавать, выставлять котиков)
    3) Для кого мой сайт (кто мой посетитель, покупатель), какую ценность мой сайт предоставит или какую проблему решит.
    4) Кто мои конкуренты и почему они хороши (их сильные и слабые стороны)
    5) Что для меня является мерилом успеха сайта (для новостного сайта это посещаемость, для магазина посещаемость не так важна как конверсия)
    6) Хорошо разбираться в том, чем планируете заняться
    7) Подсматривайте первое время за конкурентами.
    8)В интернете полно полезных материалов по этой теме. Сергей Кокшаров дал вам ссылку на материалы. Просто лучше начать малыми порциями и систематически.
    9) Верить в свои силы и свой успех)
    Ответ написан
    Комментировать
  • Чем отличается разработка ASP.NET MVC от ASP.NET API?

    saDam
    @saDam
    Microservices, .NET Core, EF Core, SQL, RabbitMQ,
    В первую очередь нужно посмотреть наследование, как они работают:
    Если вы обратите внимание то webapi и asp.mvc(далее просто mvc) контроллеры наследуются от разных классов Http.ApiController и Mvc.Controller.
    Нужно понимать что webapi предназначен для реализации REST сервисов с охватом всех видов http запросов(GET, PUT, POST, DELETE итп) и ответом на запросы к webapi вы получаете json с явным указанием статуса ответа.

    В MVC можно реализовать то же самое что и в webapi, НО! лично я считаю, что эти вещи нужно четко различать, так как в случаи с MVC, вы должны понимать, что результатом запроса в большинстве случаев является сгенерированная вьюшка, то есть результат http запроса в большенстве случаев это html или что-то похожее. Да в mvc тоже может возвращаться структурированный json(например если вы делаете таблицу с пагинацией или с динамической подгрузкой данных, в таком случаи у вас метод Index возвращает вью на которой вы пишете ajax запросы к методу GetPageForTable этого же контроллера, но тут тоже есть вариация, вы в методе GetPageForTable вольны решать, отдавать только данные или уже сгенерированную вьюшку).

    Как итог: webapi - рест сервис со всеми типами http запросов, в котором ответ(по умолчанию) приходит в структурированном json и с явным статусом состояния(200, 404 итп...) . Хорошо подходит для проектов где клиентом может быть не только веб, но и допустим мобильное приложение или еще что-то.
    MVC - работает примерно как webapi но результатом может являться сгеренированная html разметка. В таком случаи уже поддержка многих платформ с клиентской части невозможно, представьте, что делать мобильному приложению с html разметкой...
    Ответ написан
    Комментировать
  • Можно ли использовать скрипты в проекте C#?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Неудачно ник себе выбрали. Даже как-то объяснять не хочется.
    Ответ написан
    1 комментарий
  • Что выбрать ASP.NET MVC или SharePoint для Enterprise?

    GreenBee
    @GreenBee
    ASP.NET программист
    SharePoint позволяет легко и быстро реализовать многие вещи. Но стоит учесть:
    1. SharePoint - это больше и страшное ASP.NET WebForms приложение. Что бы кто не говорил, а ASP.NET WebForms будет постепенно отмирать. Хочешь ли ты изучать этого динозавра?
    2. Очень страшный HTML, который будет достаточно проблематично модифицировать. Например, тебе надо будет сделать версию для мобильных устройств.
    3. Очень мало хорошей документации. Часто на твои вопросы ты будешь находить НЕПРАВИЛЬНЫЕ ответы.
    4. Система списков взорвет твой мозг. Куча ненужных полей. Куча имен у одного поля (StaticName, InternalName) причем разные функции используют разные имена.
    5. Неочевидное поведение некоторых вещей. Рассказывать долго. Просто поверь на слово.
    6. Закрытость. Если вдруг надо что-то починить... то не сможешь.

    Мой совет: если функционал SharePoint на 100% покрывает требования вашей организации (именно 100%, не 99,9% даже), то можете пробовать. В противном случае лучше пишите с нуля. Потому что иногда даже мелкие изменения требуют огромного количества кода.
    Ответ написан
    Комментировать