C# .NET Core 3.1/React模板-REST API类-JSON结果中的忽略属性

C# .NET Core 3.1/React模板-REST API类-JSON结果中的忽略属性,c#,json,asp.net-core,react-redux,C#,Json,Asp.net Core,React Redux,我有一个关于C#Core 3.1的项目,其中React和Redux模板,其中EF Core用于DB。我需要从通过RESTAPI控制器发送的DTO类中排除Id 我需要为与负载相关的类vie EF Core使用Id,但我没有在REST API结果中显示: { "id": 1, -- DISABLE to show "product": "TEST1" } C#类: public class ProductResDto {

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

我需要为与负载相关的类vie EF Core使用Id,但我没有在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();
        }
    }
控制器:

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();
        }
    }
//获取api/
[HttpPost]
公共异步任务Post(ProductReqDto模型)
{
尝试
{
var product=wait\u context.Products
.OrderBy(b=>b.Name)
.Where(w=>w.Name==model.Name)
.选择(c=>new ProductResDto
{
Id=c.Id,
产品=c.名称
}).FirstAsync();
//等级
product.Grades='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
//描述
product.Descriptions='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
//档案
product.Files='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
//参数
product.Parameters='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
返回Ok(产品);
}
捕获(例外e)
{
返回NotFound();
}
}
是否有可能在
wait\u上下文中为REST API结果或加载禁用此参数。使用
.Select()

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


谢谢你

更新你的课程如下

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

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

  • 使用 在
    Id
    属性上,如下所示:

    using System.Text.Json.Serialization;
    
    public class ProductResDto
    {
        [JsonIgnore]
        public int Id { get; set; } 
        public string Product { get; set; }
    }
    
  • 为您的应用程序创建包含所有
    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;
    }
    
    //获取api/
    [HttpPost]
    公共异步任务Post(ProductReqDto模型)
    {
    尝试
    {
    var product=wait\u context.Products
    .OrderBy(b=>b.Name)
    .Where(w=>w.Name==model.Name)
    .选择(c=>new ProductResDto
    {
    Id=c.Id,
    产品=c.名称
    }).FirstAsync();
    //等级
    product.Grades='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
    //描述
    product.Descriptions='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
    //档案
    product.Files='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
    //参数
    product.Parameters='';//加载ADD.INFO(使用product.Id,如数据库中的FK)
    var productOutContract=转换为OutCountract(产品);
    返回Ok(productOutContract);
    }
    捕获(例外e)
    {
    返回NotFound();
    }
    }
    私有静态ProductReqOutContract转换为输出计数契约(ProductReqDto product)
    {
    var outCountract=新产品OutContract
    {
    //填充属性;
    };
    回报率;
    }
    
  • 返回Id也不错。你应该把模型放在上面 正确地安装前端


  • 我喜欢第二种或第三种解决方案。当API层和数据层分开时,这一点更为明显。

    在向客户端发送Dto之前,请将其值设置为零。是否需要从JSON响应中排除该属性?如果是这样,您可以使用[JsonIgnore]属性。将DTO属性设置为零或Null不是正确的解决方案。NewtonJson库中只有JsonIgnor,但在这种情况下不是wokIn,我必须安装一些Nuget包吗?因为VS不识别Json,所以NewtonJson中只有JsonIgnore引用。libI必须安装Nuget包[System.Text.Json.Serialization],在这之后工作正常,我看不到Id属性,默认情况下THXdefault ASP.NET核心模板已经使用
    System.Text.Json