【问题标题】:.NET Core 3.1/React Template - REST API Class - Ignore Property in JSON result.NET Core 3.1/React 模板 - REST API 类 - 忽略 JSON 结果中的属性
【发布时间】:2020-10-21 14:14:43
【问题描述】:

我有一个关于 C# Core 3.1 的项目,其中包含 ReactRedux 模板以及用于 DB 的 EF Core。我需要从通过 REST API 控制器发送的 DTO 类中排除 Id。

我需要将 Id 用于与负载相关的类 vie EF Core,但我没有显示在 REST API 结果中:

{
    "id": 1, -- DISABLE to show
    "product": "TEST1"
}

C# 类:

public class ProductResDto
{
    public int Id { get; set; } // DISABLE to show in REST API result
    public string Product{ get; set; }
}

控制器:

    // GET api/<ProductController>
    [HttpPost]
    public async Task<IActionResult> Post(ProductReqDto model)
    {
        try
        {
            var product = await _context.Products
                .OrderBy(b => b.Name)
                .Where(w => w.Name == model.Name)
            .Select(c => new ProductResDto
            {
                Id = c.Id,
                Product = c.Name                    
            }).FirstAsync();

            // Grades
            product.Grades = ''; // LOAD ADD. INFO (use product.Id like FK in DB)

            // Description
            product.Descriptions = ''; // LOAD ADD. INFO (use product.Id like FK in DB)

            // Files
            product.Files = ''; // LOAD ADD. INFO (use product.Id like FK in DB)

            // Parameters
            product.Parameters = ''; // LOAD ADD. INFO (use product.Id like FK in DB)

            return Ok(product);
        }
        catch (Exception e)
        {
            return NotFound();
        }
    }

是否有机会为 REST API 结果禁用此参数或使用 .Select() 加载到 await _context.Products

2 个对象:一个仅用于 ID,一个用于 ProductResDto

谢谢

【问题讨论】:

  • 在将 Dto 发送到客户端之前设置它的值为零。
  • 您需要从 JSON 响应中排除该属性吗?如果是这样,您可以使用 [JsonIgnore] 属性。
  • 将 DTO 属性设置为零或空不是正确的解决方案。只有 JsonIgnor 位于 NewtonJson lib 中,但不是 wok

标签: c# json asp.net-core react-redux


【解决方案1】:

如下更新你的课程

public class ProductResDto
{
    [System.Text.Json.Serialization.JsonIgnore]
    public int Id { get; set; } 
    public string Product { get; set; }
}

【讨论】:

  • 在这种情况下,我必须安装一些 Nuget 包吗?因为VS不识别Json,所以只有JsonIgnore引用在NewtonJson lib中
  • 我必须安装 Nuget 包 [System.Text.Json.Serialization] 之后工作正常,我没有看到 Id 属性,THX
  • 默认 ASP.NET Core 模板已经默认使用System.Text.Json
【解决方案2】:

我看到了不同的解决方案:

  1. 使用 JsonIgnoreAttributeId 这样的属性上:

    using System.Text.Json.Serialization;
    
    public class ProductResDto
    {
        [JsonIgnore]
        public int Id { get; set; } 
        public string Product { get; set; }
    }
    
  2. 为您的应用程序创建Contract-layer,它将包含所有 OutCountract 模型。所以你的合同模型将不包含 Id属性:

    public class ProductResOutContract
    {
        public string Product { get; set; }
    }
    

    并像这样使用它:

    // GET api/<ProductController>
    [HttpPost]
    public async Task<IActionResult> Post(ProductReqDto model)
    {
        try
        {
            var product = await _context.Products
                .OrderBy(b => b.Name)
                .Where(w => w.Name == model.Name)
            .Select(c => new ProductResDto
            {
                Id = c.Id,
                Product = c.Name                    
            }).FirstAsync();
    
            // Grades
            product.Grades = ''; // LOAD ADD. INFO (use product.Id like FK in DB)
    
            // Description
            product.Descriptions = ''; // LOAD ADD. INFO (use product.Id like FK in DB)
    
            // Files
            product.Files = ''; // LOAD ADD. INFO (use product.Id like FK in DB)
    
            // Parameters
            product.Parameters = ''; // LOAD ADD. INFO (use product.Id like FK in DB)
    
            var productOutContract = ConvertToOutCountract(product);
    
            return Ok(productOutContract);
        }
        catch (Exception e)
        {
            return NotFound();
        }
    }
    
    private static ProductReqOutContract ConvertToOutCountract(ProductReqDto product)
    {
        var outCountract = new ProductOutContract
        {
            // Fill the properties;
        };
    
        return outCountract;
    }
    
  3. 返回ID也不错。你应该只处理模型 前端正确。

我更喜欢第二种或第三种解决方案。当 API 层和数据层分开时更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多