c#mvc-如何从泛型方法返回特定视图
我的服务层返回错误代码,我必须返回相应的视图。但由于有许多可能的错误代码,我的控制器方法将有很大的切换情况。因此,我决定从具有以下方法的某个基本控制器继承所有控制器:c#mvc-如何从泛型方法返回特定视图,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我的服务层返回错误代码,我必须返回相应的视图。但由于有许多可能的错误代码,我的控制器方法将有很大的切换情况。因此,我决定从具有以下方法的某个基本控制器继承所有控制器: public IActionResult GetResponse<T>(ServiceResponse<T> serviceResponse) { switch (serviceResponse.Result) { case ServiceR
public IActionResult GetResponse<T>(ServiceResponse<T> serviceResponse)
{
switch (serviceResponse.Result)
{
case ServiceResult.Ok: return Ok(serviceResponse.ResponseObject);
case ServiceResult.ValidationError: return BadRequest(serviceResponse.Messages);
case ServiceResult.NoPermission: return Unauthorized(serviceResponse.Messages);
case ServiceResult.NotFound: return BadRequest(serviceResponse.Messages);
default: return BadRequest();
}
}
公共IActionResult GetResponse(ServiceResponse ServiceResponse)
{
开关(serviceResponse.Result)
{
案例ServiceResult.Ok:返回Ok(serviceResponse.ResponseObject);
案例ServiceResult.ValidationError:返回BadRequest(serviceResponse.Messages);
case servicesult.NoPermission:返回未经授权的(servicesponse.Messages);
案例ServiceResult.NotFound:返回BadRequest(serviceResponse.Messages);
默认值:return BadRequest();
}
}
现在,问题是,该方法的输入参数来自服务层。服务层返回me实体对象。我需要从这个实体对象创建ViewModel。我可以传递一个指示所需ViewModel类型的参数,并创建另一个开关块,但我认为这不是最好的选择。在我的例子中,有没有办法将实体映射到视图模型对象?您可以添加一个错误处理中间件,如下面所示,并将其挂接到管道中。当然,你需要为你自己的故事修改这个
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
if (ex is CustomExceptionOne) code = HttpStatusCode.BadRequest;
if (ex is CustomExceptionTwo) code = HttpStatusCode.Unauthorized;
var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
在启动配置方法中:
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
如果我有异常,这将非常好,但是如果我可以处理没有异常的错误,我不想抛出异常。它不一定是异常。您可以更改中间件中的逻辑以读取结果,并根据该结果而不是异常做出决定。