Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何从自定义属性返回操作结果?_Asp.net Core_Error Handling_Attributes_Authorization_Actionresult - Fatal编程技术网

Asp.net core 如何从自定义属性返回操作结果?

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

我正在使用ASP.Net Core 3.1和Identity,我正在尝试创建一个自定义授权属性,该属性将测试某些属性,然后在出现问题时显示错误,而不重定向(或者如果一切正常,则不执行任何操作)


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
方法

有人对此有解决方案或想法吗?我觉得这是一个有点愚蠢的问题,但我已经尝试了很长时间,没有明显的方法来实现我想要的