如何在 .net mvc web 中修改响应 api

how to modify response in .net mvc web api

您好,我有一个 C# 模型 class。这个 class 我需要通过设置他的 属性 作为 json 响应传递。这个 class 的一个 属性 名称产品具有另一个产品 class 的类型,当没有产品的数据时,我将所有内部 属性 值都设为空白,而不是那个我想要空白 json 属性 .

对于 Exp 我的 Class 是

 public class Profile_BO
{

    public int Id { get; set; }
    public string Username { get; set; }
    public Product product{ get; set; }


    public class Product
    {
        public int Id { get; set; }
        public string Type { get; set; }
    }
}

我正在从 C# 数据 table 中初始化此 class,如下所示:-

       Profile_BO profile_BO = new Profile_BO();

            foreach (DataRow dr in result.Tables[0].Rows)
            {
                profile_BO.Id = Convert.ToInt32(dr[0]);
                profile_BO.Username = Convert.ToString(dr[1]);
            }

            Product product = new Product();

            foreach (DataRow dr1 in result.Tables[1].Rows)
            {
                product.Id = Convert.ToInt32(dr1[0]);
                product.Type = Convert.ToString(dr1[1]);
            }

            profile_BO.product = product;

最后,当我作为对方法的响应传递时:-

 public async Task<HttpResponseMessage> GetUserInfo(Profile_Request profile_Request)
    {
           return request.CreateResponse(HttpStatusCode.OK, profile_BO);
}

并且在客户端调用时我得到响应 json 如果数据存在于 table 中,例如:-

{
  "Id": "1",
  "Username": "abc",
  "product": {
    "Id": "232",
    "Type": "34cvdcbv"
  }
}

但是当我 产品中没有数据时 table 我得到以下结果:-

{
  "Id": "1",
  "Username": "abc",
  "product": {
    "Id": 0,
    "Type": ""
  }
}

但是如果没有数据 我想要输出如下:-

{
  "Id": "1",
  "Username": "abc",
  "product": {}
}

另一个问题是:- 从数据集绑定响应模型的方法是否正确?

您面临的问题是,您正在初始化 Product 的实例,而不考虑可能根本没有产品的事实。这导致其属性使用默认值进行初始化。 Int32 默认为 0。System.String 作为引用类型是 null.

Profile_BO profile_BO = new Profile_BO();

foreach (DataRow dr in result.Tables[0].Rows)
{
    profile_BO.Id = Convert.ToInt32(dr[0]);
    profile_BO.Username = Convert.ToString(dr[1]);
}

//I am assuming you only expect one row, since oyur model uses a single Product
//and no collection of products. No need for a loop then.
if(result.Tables[1].Rows.Count == 1) { 
    Product product = new Product();
    var dr1 = result.Tables[1].Rows[0];

    product.Id = Convert.ToInt32(dr1[0]);
    product.Type = Convert.ToString(dr1[1]);

    profile_BO.product = product;
}

这将导致返回以下 JSON:

{
  "Id": "1",
  "Username": "abc",
  "product": null
}

编辑:如果您真的必须 product : {},那么您需要更改模型。

public class Profile_BO
{
    public int Id { get; set; }
    public string Username { get; set; }
    public object product { get; set; }

}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

将产品声明为 object。由于所有 类 都继承自对象,因此您可以将其实例化为对象或产品,具体取决于您的情况:

if(result.Tables[1].Rows.Count == 1) { 
    Product product = new Product();
    var dr1 = result.Tables[1].Rows[0];

    product.Id = Convert.ToInt32(dr1[0]);
    product.Type = Convert.ToString(dr1[1]);

    profile_BO.product = product;
}

或者:

if(result.Tables[1].Rows.Count == 0) { 
    var product = new object();    
    profile_BO.product = product;
}

这将导致:

{"Id":1,"Username":"Foo Bar","product":{}}

但是我强烈建议使用第一种方法,因为这将使测试和修改更容易,因为您保留了强类型方法。

我之前的回答对你的最后一个问题没有帮助。所以这是我编辑的解决方案。

更好的解决方案

使用自定义消息处理程序可能是更好的解决方案。

A delegating handler can also skip the inner handler and directly create the response.

自定义消息处理程序:

public class NullJsonHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {

            var updatedResponse = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = null
            };

            var response = await base.SendAsync(request, cancellationToken);

            if (response.Content == null)
            {
                response.Content = new StringContent("{}");
            }

            else if (response.Content is ObjectContent)
            {

                var contents = await response.Content.ReadAsStringAsync();

                if (contents.Contains("null"))
                {
                    contents = contents.Replace("null", "{}");
                }

                updatedResponse.Content = new StringContent(contents,Encoding.UTF8,"application/json");

            }

            var tsc = new TaskCompletionSource<HttpResponseMessage>();
            tsc.SetResult(updatedResponse);   
            return await tsc.Task;
        }
    }

注册处理程序:

Global.asax 文件中的 Application_Start() 方法中,通过添加以下代码注册您的处理程序。

GlobalConfiguration.Configuration.MessageHandlers.Add(new NullJsonHandler());

现在所有包含 nullAsp.NET Web API 响应将被替换为空 Json 正文 {}.

参考文献:

1.

2.