Asp.net ApiController:如何在请求模型中表示变量参数
Asp.net ApiController: How to represent variable parameters in request model
我正在将一项旧服务迁移到 Asp.net,并且需要保留旧版请求格式。挑战在于 POST 主体参数的数量是可变的,数量由计数参数指定。例如...
COUNT=3&PARAM1=A&PARAM2=B&PARAM3=C
我正在使用 ApiController 进行另一个调用,它运行良好。但是在这种情况下,我不知道如何在不创建一堆占位符属性(PARAM1、PARAM2、...、PARAM100)的情况下定义模型。
所以..如果我有这个..
public class MyController : ApiController
{
public HttpResponseMessage MyService(MyServiceRequest request)
{
}
}
如何定义 MyServiceRequest class 以便我可以访问 PARAM1、PARAM2 等(而不仅仅是预定义比我认为我需要的更多的 PARAM 属性)?
public class MyServiceRequest
{
public string COUNT { get; set; }
/* Don't want to have to do this
public string PARAM1 { get; set; }
public string PARAM2 { get; set; }
:
public string PARAM1000 { get; set; }
*/
}
谢谢!
在这种情况下,我通常使用 List
参数:
public class MyServiceRequest
{
public List<string> PARAM { get; set; }
}
考虑实施自定义模型联编程序
//using System.Web.Http.ModelBinding;
public class LegacyBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
//reading request data
NameValueCollection formData = actionContext.ControllerContext.Request.Content.ReadAsFormDataAsync().GetAwaiter().GetResult();
var model = new MyServiceRequest
{
Params = new List<string>()
};
model.Count = formData["count"];
foreach (string name in formData)
{
//simple check, "param1" "paramRandomsring" will pass
//if (name.StartsWith("param", StringComparison.InvariantCultureIgnoreCase))
//more complex check ensures "param{number}" template
if (Regex.IsMatch(name, @"^param\d+$", RegexOptions.IgnoreCase))
{
model.Params.Add(formData[name]);
}
}
bindingContext.Model = model;
return true;
}
}
并告诉框架将此模型绑定器用于具体模型
[ModelBinder(typeof(LegacyBinder))]
public class MyServiceRequest
{
public string Count { get; set; }
public List<string> Params { get; set; }
}
在 docs 的 ASP.NET Web API 中阅读有关模型绑定的更多信息。
我正在将一项旧服务迁移到 Asp.net,并且需要保留旧版请求格式。挑战在于 POST 主体参数的数量是可变的,数量由计数参数指定。例如...
COUNT=3&PARAM1=A&PARAM2=B&PARAM3=C
我正在使用 ApiController 进行另一个调用,它运行良好。但是在这种情况下,我不知道如何在不创建一堆占位符属性(PARAM1、PARAM2、...、PARAM100)的情况下定义模型。
所以..如果我有这个..
public class MyController : ApiController
{
public HttpResponseMessage MyService(MyServiceRequest request)
{
}
}
如何定义 MyServiceRequest class 以便我可以访问 PARAM1、PARAM2 等(而不仅仅是预定义比我认为我需要的更多的 PARAM 属性)?
public class MyServiceRequest
{
public string COUNT { get; set; }
/* Don't want to have to do this
public string PARAM1 { get; set; }
public string PARAM2 { get; set; }
:
public string PARAM1000 { get; set; }
*/
}
谢谢!
在这种情况下,我通常使用 List
参数:
public class MyServiceRequest
{
public List<string> PARAM { get; set; }
}
考虑实施自定义模型联编程序
//using System.Web.Http.ModelBinding;
public class LegacyBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
//reading request data
NameValueCollection formData = actionContext.ControllerContext.Request.Content.ReadAsFormDataAsync().GetAwaiter().GetResult();
var model = new MyServiceRequest
{
Params = new List<string>()
};
model.Count = formData["count"];
foreach (string name in formData)
{
//simple check, "param1" "paramRandomsring" will pass
//if (name.StartsWith("param", StringComparison.InvariantCultureIgnoreCase))
//more complex check ensures "param{number}" template
if (Regex.IsMatch(name, @"^param\d+$", RegexOptions.IgnoreCase))
{
model.Params.Add(formData[name]);
}
}
bindingContext.Model = model;
return true;
}
}
并告诉框架将此模型绑定器用于具体模型
[ModelBinder(typeof(LegacyBinder))]
public class MyServiceRequest
{
public string Count { get; set; }
public List<string> Params { get; set; }
}
在 docs 的 ASP.NET Web API 中阅读有关模型绑定的更多信息。