Asp.net core 如何从自定义属性返回操作结果?
我正在使用ASP.Net Core 3.1和Identity,我正在尝试创建一个自定义授权属性,该属性将测试某些属性,然后在出现问题时显示错误,而不重定向(或者如果一切正常,则不执行任何操作)Asp.net core 如何从自定义属性返回操作结果?,asp.net-core,error-handling,attributes,authorization,actionresult,Asp.net Core,Error Handling,Attributes,Authorization,Actionresult,我正在使用ASP.Net Core 3.1和Identity,我正在尝试创建一个自定义授权属性,该属性将测试某些属性,然后在出现问题时显示错误,而不重定向(或者如果一切正常,则不执行任何操作) TL;DR-除了http状态码(如403),我找不到将信息传递到错误页面的方法。我想在不重定向用户的情况下将信息(如错误消息)从属性传递到错误页面,我不知道如何传递 我已经实现了如下授权属性: 公共类CustomValidationAttribute:AuthorizationAttribute,IA
TL;DR-除了http状态码(如403),我找不到将信息传递到错误页面的方法。我想在不重定向用户的情况下将信息(如错误消息)从属性传递到错误页面,我不知道如何传递
我已经实现了如下授权属性:
公共类CustomValidationAttribute:AuthorizationAttribute,IAsyncAuthorizationFilter
然后我将这个类用作Razor页面、控制器等的属性
[自定义验证(这里有一些道具)]
公共类SomePageModel:PageModel{}
在这个CustomValidationAttribute
中,我有一个重写的方法OnAuthorizationAsync
,如果某些道具没有满足传递给属性的要求,它要么不返回任何内容,要么返回错误。太好了
但是,撇开没有简单的方法从这个方法返回视图结果不谈,我已经设法找到了一种不重定向显示错误的方法。在Startup.cs中,我添加了一些处理程序:
app.UseExceptionHandler(“/error”);
app.UseStatusCodePagesWithReExecute(“/error/{0}”);
现在,如果我从属性返回一个new result()
或new unahorizedresult()
,一切正常-它不会重定向(用户停留在遇到错误的页面上),代码会正确地传递给错误处理程序(即401、403等)
在本例中加载的视图是/Error,这是一个如下路由的razor页面:@page”/Error/{code?}“
问题是,一旦我试图更具体地说明错误,我就开始遇到麻烦。首先,我无法找到将消息从属性传递到错误的方法
AuthorizationAsync(AuthorizationFilterContext上下文)上的公共异步任务
{
...
//只是传递错误代码
context.Result=新结果();
//相同,但有一些无用的属性,如ViewData,不会保留
//也不会从目标方法(例如在ErrorModel.OnGet)访问它们
context.Result=newviewresult(){
StatusCode=(int)HttpStatusCode.Unahorized
}
//我如何使它更具体??
//我对理想回报的愿望是:
context.Result=newactionresult(“Error”,“OnGet”,newerrorviewmodel{Message,StatusCode,…}
//…但没有办法
}
没有合适的Result
类型可返回-诸如unhorized
或bank
之类的结果在其构造函数中不包含任何特定信息,ViewResult
,我拥有的唯一解决方案是返回ObjectResult
,它实际上完成了工作,但不加载p年龄布局等(只返回文本原样)
其次,理想情况下,我会加载一个错误页面作为部分视图,该视图将使用包含要显示的信息的模型。这里也不走运,因为PartialViewResult
也不接受任何参数
说到ViewResult
s,我知道我可以这样设置它们的属性:
context.Result=new PartialViewResult
{
StatusCode=(int)HttpStatusCode.Unauthorized
};
但是这个对象不保存信息。这意味着,这些信息不会到达错误页面的OnGet
方法
有人对此有解决方案或想法吗?我觉得这是一个有点愚蠢的问题,但我已经尝试了很长时间,没有明显的方法来实现我想要的