无法通过ExceptionFilter

时间:2020-05-16 15:52:17

标签: .net asp.net-mvc asp.net-core .net-core error-handling

.Net Core 3.1

我有一个ExceptionFilter,我想在其中传递带有RedirectResult的TempData值。

以下是我的代码:

public class CustomExceptionFilterAttribute : IExceptionFilter
{
    private readonly ITempDataProvider _tempDataProvider;

    public CustomExceptionFilterAttribute(ITempDataProvider tempDataProvider)
    {
         _tempDataProvider = tempDataProvider;
    }

    public void OnException(ExceptionContext context)
    {
        //Log The Exception here

        //After Log
        var url = context.HttpContext.Request.Path.ToUriComponent();
        context.ExceptionHandled = true;
        context.HttpContext.Response.Clear();

        var tempData = new TempDataDictionary(context.HttpContext, _tempDataProvider);
        tempData.Add("UserFriendlyMessage", "An Error Occured! Please contact Admin!");
        tempData.Keep("UserFriendlyMessage"); //This didn't work either...

        var result = new RedirectResult(url);
        context.Result = result;    
    }
}
[TypeFilter(typeof(CustomExceptionFilterAttribute))]
public class MyController : Controller
{...
public IActionResult MyAction()
{
    return View();
}
[HttpPost]
public IActionResult MyAction(MyModel model)
{
    try
    { 
       int a = 5;
       int b = a / 0;
    }
    catch(Exception ex)
    {

    }
    return View();
}

因此,如您在上面看到的,我的目标是将用户重定向到同一页面(发生异常的地方),并防止他们重定向500StatusCode错误页面。

实际上,这段代码将用户重定向为我想要的方式,但是 TempData 值未传递。

我尝试过:
-context.HttpContext.Response.Clear();尝试了此代码,但没有此代码。
-tempData.Keep("UserFriendlyMessage");尝试过此代码,但没有此代码。

1 个答案:

答案 0 :(得分:1)

我已经弄清楚了,希望它能对遇到这种情况的人有所帮助。

我已删除ITempDataProvider并放了ITempDataDictionaryFactory

public class CustomExceptionFilterAttribute : IExceptionFilter
{
    private readonly ITempDataDictionaryFactory _tempDataFactory;

    public CustomExceptionFilterAttribute(ITempDataDictionaryFactory tempDataFactory)
    {
         _tempDataFactory = tempDataFactory;
    }

    public void OnException(ExceptionContext context)
    {
        //Log The Exception here

        //After Log
        var url = context.HttpContext.Request.Path.ToUriComponent();
        context.ExceptionHandled = true;
        context.HttpContext.Response.Clear();

        //-----------THIS WAS THE PART THAT HAS PROBLEM----------------
        //var tempData = new TempDataDictionary(context.HttpContext, _tempDataProvider);
        //tempData.Add("UserFriendlyMessage", "An Error Occured! Please contact Admin!");
        //tempData.Keep("UserFriendlyMessage"); //This didn't work either...
        //var result = new RedirectResult(url);
        //context.Result = result; 
        //-------------------------------------------------------------   

        //I've changed it to:
        var tempData = _tempDataDictionaryFactory.GetTempData(context.HttpContext);
        tempData.Add("UserFriendlyMessage", "An Error Occured!"); 

        var result = new RedirectResult(url);
        context.Result = result;
    }
}

注意::所以我认为错误的部分是我正在使用new TempDataDictionary创建一个TempData的新实例,现在我使用的是 current TempData,
如果有人知道我在做什么错,请告诉我。 :)

相关问题