web api空查询字符串参数

时间:2016-03-12 13:17:19

标签: c# asp.net asp.net-web-api asp.net-web-api2

我正在尝试将多个参数传递给httpget web api函数。我遇到的关键问题是空查询字符串参数被转换为null。

我可以通过创建类似下面的类来解决这个问题:

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; }
}

但我绝对不喜欢为一次性使用创建课程的想法。

我做了很多研究,我真的很难找到一种方法来改变除上述之外的默认行为。我真的只想这样做:

    [HttpGet]
    public object Search(string batch_number, string filter, string initiation_month, string initiation_year)
    {
    }

我是否错过了一种简单的方法来更改此默认行为,或者我应该注意什么来阻止我自己可以全局应用的查询字符串解析器?

由于

更新

我的帖子似乎有些混乱,对不起,如果我不清楚的话。我会尽力澄清。

我想将简单的原始类型传递给我的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

如果我更改搜索功能以在第一个代码段中使用该类,它将按我的意愿工作,但我真的试图避免长期使用api参数类。

2 个答案:

答案 0 :(得分:0)

我相信这是设计的。如果ModelBinder无法映射参数,则会恢复为参数的默认类型。

如果它是一个简单的值类型,例如int,那么会将该值设置为0

查看以下文章,了解它是否可以帮助您

Parameter Binding in ASP.NET Web API

答案 1 :(得分: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;
    }
}