Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
c#mvc-如何从泛型方法返回特定视图_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

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));

如果我有异常,这将非常好,但是如果我可以处理没有异常的错误,我不想抛出异常。它不一定是异常。您可以更改中间件中的逻辑以读取结果,并根据该结果而不是异常做出决定。