簡體   English   中英

c# mvc - 如何從泛型方法返回特定視圖

[英]c# mvc - how to return specific view from generic method

我的服務層返回錯誤代碼,我必須返回相應的視圖。 但是有許多可能的錯誤代碼,我的控制器方法會有很大的開關案例。 所以我決定從一些具有這種方法的基本控制器繼承所有控制器:

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

現在,問題是,此方法的輸入參數來自服務層。 服務層返回我實體對象。 我需要以某種方式從這個實體對象創建 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM