При добавлении модели в базу данных, если некоторые поля в модели == null
, то будет исключение System.Data.SqlClient.SqlException
, которое возвращает код 500. Как правильно сделать обработку этого исключения?
Мои варианты:
Сделать проверку всех полей модели в контроллере, если какие-нибудь поля == null
, то писать об этом во view. Мне не нравится этот вариант, тк полей может быть 1000 и придется писать для каждого проверку.
С помощью 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 оно почему-то не возвращает и ошибка появляется после запроса к бд, а я бы хотел без запроса к бд справиться.
Добавьте в модель атрибуты
https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute(v=vs.110).aspx
и проверьте, на валидность.
if(!myModel.IsValid)
//код обработки ошибки
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
У меня возникла такая проблема, на Unity я написал минимальную игру и хочу, чтоб со мной мог играть и мой друг с своего компа, но когда он пытается...
Пишу самообучающийся спам-фильтр, используя наивный классификатор Байесса на C#При обучении программа будет проходить файлы со спамом и не спамом,...
Тк мне часто приходится делать гет запросы я вывел все в отдельную функцию