Веб-приложение ASP.Net Core 7.0 (модель-представление-контроллер) ErrorViewModel OnGet OnPost не вызывается и не выполняется

Я изо всех сил пытался настроить глобальную обработку ошибок для моего веб-приложения ASP.Net Core MVC. Я пытался применить следующую статью, но мне не повезло.

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-7.0

Запуск приложения с помощью IIS Express в режиме отладки.

На данный момент я просто создаю новый проект веб-приложения. В частности, веб-приложение ASP.Net Core 7.0 (модель-представление-контроллер). Единственный код, который я изменил по сравнению с тем, который вы получаете по умолчанию при создании нового проекта, это следующий.

Программа.cs

// Configure the HTTP request pipeline.
//if (!app.Environment.IsDevelopment())
//{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
//}

Контроллеры/HomeController.cs

//added HttpGet attribute to main index action.
[HttpGet]
public IActionResult Index()
{
    //throw an application exception to test error handling
    throw new ApplicationException("This is an error");
    return View();
}

Модели/ErrorViewModel.cs

    //Added class attributes and PageModel inheritance
    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    [IgnoreAntiforgeryToken]
    public class ErrorViewModel : PageModel

        public string? RequestId { get; set; }

        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);


        //added OnGet method
        public void OnGet()
        {
            string thisIsDumb = "dumb";
        }

Shared/Error.cshtml — без изменений. Если я добавлю @page вверху, это нарушит использование ViewData["Title"], т.е. ViewData["Title"] = "Error" больше не работает. ViewData становится нулевым.

Я чувствую, что это должно быть более прямолинейно, но я явно что-то упускаю. Я пытаюсь заставить любое необработанное исключение, возникающее в моем веб-приложении, заполниться на веб-странице с подробными сведениями об ошибках. Мне бы очень хотелось иметь некоторую глобальную обработку ошибок, но я просто не могу заставить базовый OnGet OnPost работать в модели, и я не знаю, как передать любую форму исключения в ErrorViewModel для использования представлением.

На что похож ваш Program.cs? Не могли бы вы поделиться больше кода? Почему вы хотите изменить модель ErrorViewModel на страницу бритвы?

Qing Guo 28.03.2024 02:28

@QingGuo Я понял. В примере кода, по крайней мере, на мой взгляд, не очень хорошо указано, что он предназначен только для Blazor (кажется). MVC отличается тем, что ExceptionHandler в примере кода обращается только к одному маршруту и ​​действию.

Rob K. 01.04.2024 17:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На случай, если кто-то еще запутается в этом, пример кода в связанной статье Обработка ошибок в ASP.NET Core, похоже, предназначен для Blazor, а не MVC. Следующий пункт из указанной статьи является указателем на это.

Для MVC примените атрибуты HTTP-глагола к нескольким действиям. Например, используйте [HttpGet] для обработки исключений GET и используйте [HttpPost] для обработки POST-исключения.

Для приложений MVC, когда вы добавляете следующий код, вы направляете все необработанные ошибки в логике вашего приложения MVC в действие при ошибке вашего контроллера по умолчанию.

Программа.cs

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Default/Error");
    app.UseHsts();
}

Хотя в указанной статье есть код

app.UseExceptionHandler("/Error");

Кажется, отсутствие контроллера «по умолчанию» в маршруте этого кода больше связано с Blazor. Для MVC необходимо добавить отсутствующий контроллер «по умолчанию» в пути маршрутов. По крайней мере, чтобы я мог заставить его работать.

С этого момента ваш контроллер по умолчанию будет выполнять примерно следующее действие:

Контроллеры/DefaultController.cs

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        string exceptionMessage = string.Empty;
        string typeOfException = string.Empty;
        var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

        if (exceptionHandlerPathFeature != null)
        {
            if (exceptionHandlerPathFeature.Error != null)
            {
                typeOfException = exceptionHandlerPathFeature.Error.GetType().Name;
                exceptionMessage = exceptionHandlerPathFeature.Error.Message;   
            }
        }

        // ... Other Code used to update your ErrorViewModel ...

        ErrorViewModel model = new ErrorViewModel();            
        model.RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
        model.SessionID = HttpContext.Session.Id ?? "No Session ID Found"; //Extended ErrorViewModel
        model.ExceptionType = typeOfException; //Extended ErrorViewModel

        //Resolves to the /Views/Shared/Error.cshtml view.
        return View(model);
    }

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

Надеюсь, это поможет кому-то еще запутаться.

Другие вопросы по теме