Обработка исключений ASP.NET MVC

363
25 сентября 2017, 00:33

При добавлении модели в базу данных, если некоторые поля в модели == null, то будет исключение System.Data.SqlClient.SqlException, которое возвращает код 500. Как правильно сделать обработку этого исключения?

Мои варианты:

  1. Сделать проверку всех полей модели в контроллере, если какие-нибудь поля == null, то писать об этом во view. Мне не нравится этот вариант, тк полей может быть 1000 и придется писать для каждого проверку.

  2. С помощью try/catch отлавливать ошибки в Data Access Layer. Тут вопрос, насколько это эффективно, тк происходит лишний запрос к бд, без которого можно обойтись.

Как правильно реализовать обработку исключений при добавлении модели в базу данных?

У меня есть обработка HttpException в Global.asax.cs:

protected void Application_Error(Object sender, EventArgs e)
        {
        var httpContext = ((MvcApplication)sender).Context;
        var currentController = string.Empty;
        var currentAction = string.Empty;
        var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
        if (currentRouteData != null)
        {
            if (!string.IsNullOrEmpty(currentRouteData.Values["controller"].ToString()))
            {
                currentController = currentRouteData.Values["controller"].ToString();
            }
            if (!string.IsNullOrEmpty(currentRouteData.Values["action"].ToString()))
            {
                currentAction = currentRouteData.Values["action"].ToString();
            }
        }

        var ex = Server.GetLastError();
        log.Error(ex.Message);
        var controller = new ErrorController();
        var routeData = new RouteData();           
        var action = "General";

        if (ex is HttpException)
        {
            switch (((HttpException)ex).GetHttpCode())
            {
                case 500:
                    action = "ServerError";
                    routeData.Values.Add("action", action);
                    break;
                case 404:
                    action = "NotFound";
                    routeData.Values.Add("action", action);
                    break;
                default:
                    action = "General";
                    routeData.Values.Add("action", action);
                    break;
            }
        }
        httpContext.ClearError();
        httpContext.Response.Clear();
        httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
        httpContext.Response.TrySkipIisCustomErrors = true;
        routeData.Values.Add("controller", "Error");
        routeData.Values["action"] = action;
        Response.ContentType = "text/html";
        controller.ViewData.Model = new Exception(ex.ToString());
        ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
        }

Но представление для 500 оно почему-то не возвращает и ошибка появляется после запроса к бд, а я бы хотел без запроса к бд справиться.

Answer 1

Добавьте в модель атрибуты
https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute(v=vs.110).aspx

и проверьте, на валидность.

if(!myModel.IsValid)
 //код обработки ошибки
READ ALSO
Network Unity как сделать соединение между разными комп'ютерами

Network Unity как сделать соединение между разными комп'ютерами

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

285
Как лучше хранить данные обучения спам-фильтра? C#

Как лучше хранить данные обучения спам-фильтра? C#

Пишу самообучающийся спам-фильтр, используя наивный классификатор Байесса на C#При обучении программа будет проходить файлы со спамом и не спамом,...

297
Xnet получить исх код из функции c#

Xnet получить исх код из функции c#

Тк мне часто приходится делать гет запросы я вывел все в отдельную функцию

237