如何在 .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());
现在所有包含 null
的 Asp.NET Web API
响应将被替换为空 Json
正文 {}
.
参考文献:
1.
您好,我有一个 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());
现在所有包含 null
的 Asp.NET Web API
响应将被替换为空 Json
正文 {}
.
参考文献:
1.