将空查询字符串参数视为空字符串,而不使用 class 作为参数
Treat empty query string parameters as empty strings, without using a class for parameters
我正在尝试将多个参数传递给 httpget web api 函数。我遇到的关键问题是空查询字符串参数被转换为 null。
我可以通过创建一个如下所示的 class 来解决这个问题:
public class CuttingParams
{
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string batch_number { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string filter { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string initiation_month { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string initiation_year { get; set; }
}
但我绝对讨厌必须创建一个一次性使用的 class 的想法。
我做了很多研究,并且真的在努力寻找一种方法来改变除上述以外的默认行为。我真的只想这样做:
[HttpGet]
public object Search(string batch_number, string filter, string initiation_month, string initiation_year)
{
}
我是否缺少更改此默认行为的简单方法,或者我应该查看什么来实现我自己的可以全局应用的查询字符串解析器?
谢谢
更新
我的 post 似乎有些混乱,如果我不清楚,请见谅。我会尽力澄清。
我只想将简单的基本类型传递给我的 HttpGet 方法,如第二个代码片段所示。我遇到的问题是空字符串参数将被转换为 null。
ie. this url: http://localhost/api/cutting/search?batch_number=&filter=&intiation_month=Jan&initiation_year=2016
将在 api 中产生以下值:
batch_number = null
filter = null
initiation_month = Jan
initiation_year = 2016
如果我将搜索功能更改为使用第一个代码片段中的 class,它将按我的意愿工作,但我真的试图避免对 [=39= 使用 classes ] 长期参数。
我相信这是设计使然。如果 ModelBinder
无法映射参数,它将恢复为参数的默认类型。
如果它是像 int
这样的简单值类型,则会发生同样的情况,它将将该值设置为 0
看看下面这篇文章是否能帮到你
好的,我按照我想要的方式工作了。我不得不改编一些我为 mvc web api 找到的类似代码,但使它变得更简单。如下所示创建您的自定义模型活页夹并将其添加到全局配置中。希望这对其他人有帮助。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
GlobalConfiguration.Configuration.BindParameter(typeof(string), new EmptyStringModelBinder());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
}
}
public class EmptyStringModelBinder : System.Web.Http.ModelBinding.IModelBinder
{
public bool BindModel(HttpActionContext actionContext, System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
{
string val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
bindingContext.Model = val;
return true;
}
}
我正在尝试将多个参数传递给 httpget web api 函数。我遇到的关键问题是空查询字符串参数被转换为 null。
我可以通过创建一个如下所示的 class 来解决这个问题:
public class CuttingParams
{
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string batch_number { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string filter { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string initiation_month { get; set; }
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string initiation_year { get; set; }
}
但我绝对讨厌必须创建一个一次性使用的 class 的想法。
我做了很多研究,并且真的在努力寻找一种方法来改变除上述以外的默认行为。我真的只想这样做:
[HttpGet]
public object Search(string batch_number, string filter, string initiation_month, string initiation_year)
{
}
我是否缺少更改此默认行为的简单方法,或者我应该查看什么来实现我自己的可以全局应用的查询字符串解析器?
谢谢
更新
我的 post 似乎有些混乱,如果我不清楚,请见谅。我会尽力澄清。
我只想将简单的基本类型传递给我的 HttpGet 方法,如第二个代码片段所示。我遇到的问题是空字符串参数将被转换为 null。
ie. this url: http://localhost/api/cutting/search?batch_number=&filter=&intiation_month=Jan&initiation_year=2016
将在 api 中产生以下值:
batch_number = null
filter = null
initiation_month = Jan
initiation_year = 2016
如果我将搜索功能更改为使用第一个代码片段中的 class,它将按我的意愿工作,但我真的试图避免对 [=39= 使用 classes ] 长期参数。
我相信这是设计使然。如果 ModelBinder
无法映射参数,它将恢复为参数的默认类型。
如果它是像 int
这样的简单值类型,则会发生同样的情况,它将将该值设置为 0
看看下面这篇文章是否能帮到你
好的,我按照我想要的方式工作了。我不得不改编一些我为 mvc web api 找到的类似代码,但使它变得更简单。如下所示创建您的自定义模型活页夹并将其添加到全局配置中。希望这对其他人有帮助。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
GlobalConfiguration.Configuration.BindParameter(typeof(string), new EmptyStringModelBinder());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
}
}
public class EmptyStringModelBinder : System.Web.Http.ModelBinding.IModelBinder
{
public bool BindModel(HttpActionContext actionContext, System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
{
string val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
bindingContext.Model = val;
return true;
}
}