我有一个WebApi方法,它接受一个被构造为类数组的partameter:
public JsonResult<ApiReportResponse<GeneratedReport>> GenerateReport(int reportId, CustomReportFormat reportFormat, [FromUri] ReportParameter[] reportParameters = null)
{ ......... }
ReportParameter
类定义为
public class ReportParameter: CustomReportParameter
{
public string ParameterName { get; set; }
public object ParameterValue { get; set; }
public string ParameterLabel { get; set; }
public bool MultiValue { get; set; }
public CustomReportDataType? ParameterDataType { get; set; }
}
reportParameters
参数是可选的
在调用此方法时,我要么将Json
ified对象字符串或结构请求url作为对象列表发送,如:
Json
ified version:
var parameterList = new List<ReportParameter>();
parameterList.Add(new ReportParameter { ParameterName = "TestParam", ParameterValue = 1});
var url = "<report url here>" + "reportId=1&reportFormat=Pdf&reportParameters=" + Newtonsoft.Json.JsonConvert.SerializeObject( requiredParameters.ToArray());
Url看起来像这样:
http://localhost:11111/ReportApi/Report/GenerateReport?reportId=41&reportFormat=Pdf&reportParameters=[{\"ParameterName\":\"TestParam\",\"ParameterValue\":1}]
但WebApi控制器无法捕获此信息并将Json
ified字符串反序列化为ReportParameter[]
。
直接网址请求:
我有一个像
的网址http://localhost:11111/ReportApi/Report/GenerateReport?reportId=41&reportFormat=Pdf&reportParameters[0][ParameterName]=TestParam&reportParameters[0][ParameterValue]=1
Web Api可以毫无问题地处理此请求。
如何重新构建我的Web Api方法GenerateReport
,以便它可以同时处理这两种方法?
Upadte:在失败的Json
ified请求中,Api方法接收数组中的ReportParameter对象,但ReportParameter对象的所有值都为null。
答案 0 :(得分:0)
根据以下链接中的JSON.NET文档
https://www.newtonsoft.com/json/help/html/SerializingJSON.htm
序列化c#对象后, JsonConvert.SerializeObject()
返回一个json string
。因此,您应该使用string
作为api控制器操作的参数类型。请按照以下步骤
执行如下序列化
var parameterList = new List<ReportParameter>();
parameterList.Add(new ReportParameter { ParameterName = "TestParam", ParameterValue = 1});
var url = "<report url here>" + "reportId=1&reportFormat=Pdf&reportParameters=" + Newtonsoft.Json.JsonConvert.SerializeObject(parameterList);
另请注意,您正在使用requiredParameters.ToArray()
根据您的代码将输入序列化为parameterList.ToArray()
。
您可以使用以下签名
,而不是使用ReportParameter[] reportParameters = null
作为参数
public JsonResult<ApiReportResponse<GeneratedReport>> GenerateReport(int reportId, CustomReportFormat reportFormat, [FromUri] string reportParameters)
{
// do the null checking here for reportParameters
if(!string.IsNullOrEmpty(reportParameters))
{
// Deserialize it
JsonConvert.DeserializeObject<List<ReportParameter>>(reportParameters);
}
}
如果您现在能够看到控制器参数中的值,请告诉我。