powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / MVC: обработка исключения в контроллере
25 сообщений из 406, страница 8 из 17
MVC: обработка исключения в контроллере
    #38770997
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, подход хороший, но тогда получается, что проверку внутри бизнес-логики вообще не делаем, предполагая, что не можем получить невалидные данные на вход?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38770998
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzА как сказать контроллеру, что проверка не удалась?

На счёт того "как сказать", ASP.NET MVC/WebAPI предлагает такое понятие, как ModelState, там есть свойство IsValid, и там же наименования полей и дополнительные подробности. Валидация, биндинг, провайдер значений, всё это существует отдельно, точка сборки -- контроллер (поэтому у него и такое название). При необходимости компоненты обращаются к бизнес-логике. Сама бизнес-логика обязательно внутри должна делать повторную валидацию. Но в целом подразумевается, что в БЛ заталкиваются уже валидные данные, а невалидные данные -- это исключительные ситуации, которые надо лечить.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771001
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zzно тогда получается, что проверку внутри бизнес-логики вообще не делаем, предполагая, что не можем получить невалидные данные на вход?

Обязательно делаем. И если что-то невалидное, бросаем исключение. Но эта ситуация должна исправляться, чтобы такого небыло. Это дополнительный уровень защиты для нештатных ситуаций.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771018
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, спасибо!
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771098
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttzzно тогда получается, что проверку внутри бизнес-логики вообще не делаем, предполагая, что не можем получить невалидные данные на вход?Обязательно делаем. И если что-то невалидное, бросаем исключение.Определись уже, делаем или не делаем, а то твоя слабая позиция мало понятна.
hVosttНо эта ситуация должна исправляться, чтобы такого небыло. Это дополнительный уровень защиты для нештатных ситуаций.Это основная бизнес-логика системы. Валидация на клиенте - это необязательные бантики, которые ещё и не всегда можно сделать.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771099
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttzzА как надо? Полностью согласен с необходимостью валидации на клиенте, но ведь бизнес-логику может дернуть (в теории) вообще кто угодно. Да хоть пользователь-мерзавец вручную составил запрос. И так получилось, что entity.A > entity.B. Как быть?

Давай пока оставим бизнес-логику в покое. Возьмём пример по-проще.

var result = Model.A / Model.B;

Что делать? Ловить-оборачивать исключения или проверять Model.B на ноль перед выполнением операции? М?
Код: c#
1.
2.
3.
4.
if (model.B == 0)
    throw new InfoException("Ввёл ноль - деления не будет!");

var result = Model.A / Model.B;
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771254
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО валидация - это отдельный от бизнес-логики контур.
И с точки зрения SOLID должен инкапсулироваться отдельным набором интерфейсов и классов.

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

Пример: данные в базу может вносить пользователь через десктоп интерфейс, но также они могут прилетать пачками в наш сервис из сторонней системы.

Причём пользователь
а. может не иметь прав на редактирование всех атрибутов;
б. может вводить данные частично (черновик), остаток вводить потом, или передавать другому пользователю(ям) с большими правами и т.п.;
в. контролы уже ограничивают ввод по длине, маске, типу и проверять нужно только то, что обязательные поля заполнены.

А сервис принимает уже окончательные данные, подготовленные в сторонней системе.
Должен проверить каждый элемент в пачке (все атрибуты заполнены, значения корректные, длины строк не превышают максимума и т.п.) и выдать в ответ, что из 100 элементов 98 Accepted, а 2 Rejected с описанием из-за чего.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771255
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, а для тебя придумали System.Diagnostics.Contracts

Код: c#
1.
2.
3.
4.
5.
[ContractInvariantMethod]
protected void ObjectInvariant()
{
    Contract.Invariant(this.B != 0);
}
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771306
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostthVosttПроверка делается на уровне модели.
Уточню, вью-модели.
Правильнее таки модели, у нас же MVC. А что, что твоя модель по сути вью-модель, не суть важно.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771312
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИМХО валидация - это отдельный от бизнес-логики контур.
И с точки зрения SOLID должен инкапсулироваться отдельным набором интерфейсов и классов.

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

Пример: данные в базу может вносить пользователь через десктоп интерфейс, но также они могут прилетать пачками в наш сервис из сторонней системы.

Причём пользователь
а. может не иметь прав на редактирование всех атрибутов;
б. может вводить данные частично (черновик), остаток вводить потом, или передавать другому пользователю(ям) с большими правами и т.п.;
в. контролы уже ограничивают ввод по длине, маске, типу и проверять нужно только то, что обязательные поля заполнены.++
skyANAА сервис принимает уже окончательные данные, подготовленные в сторонней системе.
Должен проверить каждый элемент в пачке (все атрибуты заполнены, значения корректные, длины строк не превышают максимума и т.п.)Собственно, это и обсуждается: как пробрасывать ошибку внутри слоёв сервиса и как передать ошибку от сервиса к клиенту.
skyANA... и выдать в ответ, что из 100 элементов 98 Accepted, а 2 Rejected с описанием из-за чего.Ну это уже конкретная ситуация, на мой взгляд, не частая. Чаще сохранение данных происходит в одной транзакции, во всяком случае у меня.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771313
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAИМХО валидация - это отдельный от бизнес-логики контур
Начинается... Любители декомпозиции взяли пулемёт. Валидация - это такая же бизнес логика, ничего накручивать не надо. Бери готовый IValidatableObject и хоть в припляс с ним танцуй и инжекть.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771315
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей К, а для тебя придумали System.Diagnostics.Contracts

Код: c#
1.
2.
3.
4.
5.
[ContractInvariantMethod]
protected void ObjectInvariant()
{
    Contract.Invariant(this.B != 0);
}

Не нравится.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771317
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruВалидация - это такая же бизнес логика.Бизнес-логика на клиенте, ага. Клиентская валидация - это обычно необязательный бантик для удобства пользователя.
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771333
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAАлексей К, а для тебя придумали System.Diagnostics.Contracts

Код: c#
1.
2.
3.
4.
5.
[ContractInvariantMethod]
protected void ObjectInvariant()
{
    Contract.Invariant(this.B != 0);
}

Не нравится.Чем? :)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771335
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruskyANAИМХО валидация - это отдельный от бизнес-логики контур
Начинается... Любители декомпозиции взяли пулемёт. Валидация - это такая же бизнес логика, ничего накручивать не надо. Бери готовый IValidatableObject и хоть в припляс с ним танцуй и инжекть.И что в нём готового? :)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771341
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ru, и ответь на вопрос: зачем в метод Validate передаётся ValidationContext? :)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771363
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANA... и выдать в ответ, что из 100 элементов 98 Accepted, а 2 Rejected с описанием из-за чего.Ну это уже конкретная ситуация, на мой взгляд, не частая. Чаще сохранение данных происходит в одной транзакции, во всяком случае у меня.При чём тут вообще транзакции? В вашей оперативной системе пользователь долго и упорно набивает 100 записей и потом разом их сохраняет?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771402
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Ну это уже конкретная ситуация, на мой взгляд, не частая. Чаще сохранение данных происходит в одной транзакции, во всяком случае у меня.При чём тут вообще транзакции? В вашей оперативной системе пользователь долго и упорно набивает 100 записей и потом разом их сохраняет?На каждую запись, которая может содержать вложенные записи, обычно отдельная форма редактирования с сохранением в одной транзакции.

Транзакции при том, что сохраняется всё или ничего, поэтому сообщение "98 Accepted, а 2 Rejected" - это другой случай для нас достаточно редкий.
skyANAАлексей Кпропущено...
Не нравится.Чем? :)Обхожусь родными средствами C# (if... throw...).
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771507
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
При чём тут вообще транзакции? В вашей оперативной системе пользователь долго и упорно набивает 100 записей и потом разом их сохраняет?На каждую запись, которая может содержать вложенные записи, обычно отдельная форма редактирования с сохранением в одной транзакции.

Транзакции при том, что сохраняется всё или ничего, поэтому сообщение "98 Accepted, а 2 Rejected" - это другой случай для нас достаточно редкий.Задам вопрос иначе: если пользователю за день надо обработать 100 чего-то и в двух случаях он допустит ошибку, то ничего из 100 чего-то не сохранится :)
Алексей КskyANAпропущено...
Чем? :)Обхожусь родными средствами C# (if... throw...).Хм. Звучит как: не нравится LINQ, обхожусь родными средствами C# (for... foreach...).
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771510
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Кcodearticles.ruВалидация - это такая же бизнес логика.Бизнес-логика на клиенте, ага. Клиентская валидация - это обычно необязательный бантик для удобства пользователя.
Да, а чем тебе не нравится? unobtrusive на клиенте это очень удобно.

skyANAИ что в нём готового? :)
Это сковорода. Хочешь - жарь, хочешь - не жарь
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771517
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruskyANAИ что в нём готового? :)
Это сковорода. Хочешь - жарь, хочешь - не жарь Ну например выше озвучивалась проверка логина пользователя при регистрации.
В базе уникальный индекс и Алексей пожарит, перехватив и обернув исключение.

А ты как пожаришь на IValidatableObject сковороде?
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771547
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
На каждую запись, которая может содержать вложенные записи, обычно отдельная форма редактирования с сохранением в одной транзакции.

Транзакции при том, что сохраняется всё или ничего, поэтому сообщение "98 Accepted, а 2 Rejected" - это другой случай для нас достаточно редкий.Задам вопрос иначе: если пользователю за день надо обработать 100 чего-то и в двух случаях он допустит ошибку, то ничего из 100 чего-то не сохранится :)Я запутался. :-)
skyANAАлексей Кпропущено...
Обхожусь родными средствами C# (if... throw...).Хм. Звучит как: не нравится LINQ, обхожусь родными средствами C# (for... foreach...).Нет. Обходиться базовыми средствами C# не получается, поэтому мне нравится LINQ. :-)
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771555
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
codearticles.ruАлексей Кпропущено...
Бизнес-логика на клиенте, ага. Клиентская валидация - это обычно необязательный бантик для удобства пользователя.
Да, а чем тебе не нравится? unobtrusive на клиенте это очень удобно.Уг. На клиенте только Knockout.Validation .
skyANAcodearticles.ruпропущено...

Это сковорода. Хочешь - жарь, хочешь - не жарь Ну например выше озвучивалась проверка логина пользователя при регистрации.
В базе уникальный индекс и Алексей пожарит, перехватив и обернув исключение.

А ты как пожаришь на IValidatableObject сковороде?++
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771601
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAВ базе уникальный индекс и Алексей пожарит, перехватив и обернув исключение.
Ну это феерический бред, даже без комментариев.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
[quot skyANA]А ты как пожаришь на IValidatableObject сковороде?[/quot]
public class Register : IValidatableObject
{
    [DataType(DataType.Text)]
    [Display(Name = "District Name")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a District Name")]
    [StringLength(40, MinimumLength = 1, ErrorMessage = "District Name must be between 1 and 40 characters")]
    public string DistrictName { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "Url Quick Find")]
    [Required(ErrorMessage = "You must provide a Quick Find Name")]
    [StringLength(15, MinimumLength = 3, ErrorMessage = "Url Quick Find must be between 3 and 15 characters")]
    public string QuickFind { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "User name")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "User name is requred")]
    [StringLength(10, MinimumLength = 1, ErrorMessage = "Url Quick Find must be between 1 and 10 characters")]
    public string Username { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Password is requred")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Re-Enter Password")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "You must re-enter your password to confirm you have entered it correctly")]
    public string PasswordConfirm { get; set; }

    [DataType(DataType.Text)]
    [Display(Name = "Display Name")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Display Name is requred")]
    [StringLength(20, MinimumLength = 1, ErrorMessage = "Display Name must be between 1 and 20 characters")]
    public string DisplayName { get; set; }

    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email Address")]
    [Required(AllowEmptyStrings = false, ErrorMessage = "Email Address is requred")]
    [StringLength(50, MinimumLength = 4, ErrorMessage = "Email Address must be between 4 and 50 characters")]
    public string EmailAddress { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        Regex lettersOnly = new Regex("^[a-zA-Z]*$");

        if (!lettersOnly.IsMatch(QuickFind))
            yield return new ValidationResult("Only letters A - Z are allowed in the Quick Find", new string[] { "QuickFind" });

        if (!lettersOnly.IsMatch(QuickFind))
            yield return new ValidationResult("Only letters A - Z are allowed for your User name", new string[] { "Username" });

        if (Password != PasswordConfirm)
            yield return new ValidationResult("Passwords do not match", new string[] { "Password", "PasswordConfirm" });

    }
}
...
Рейтинг: 0 / 0
MVC: обработка исключения в контроллере
    #38771604
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причем это работает как с сервера, так и с клиента - про ремоут валидацию Хвост уже говорил. Единый центральный класс для валидирования моделей. Что еще нужно-то? Какие исключения?
...
Рейтинг: 0 / 0
25 сообщений из 406, страница 8 из 17
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / MVC: обработка исключения в контроллере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]