将空查询字符串参数作为空字符串,而不使用参数类

问题描述 投票:6回答:2

我正在尝试将多个参数传递给httpget网络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参数。

c# asp.net asp.net-web-api asp.net-web-api2
2个回答
1
投票

好吧,我已经按照我想要的方式进行了工作。我不得不修改我为mvc网络api找到的一些类似代码,但使其变得更加简单。如下创建您的自定义模型联编程序并将其添加到globalconfiguration。希望这对其他人有帮助。

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

0
投票

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

如果是像int这样的简单值类型,将其设置为0也会发生同样的情况>

请看下面的文章,看看是否可以帮助您

Parameter Binding in ASP.NET Web API

© www.soinside.com 2019 - 2024. All rights reserved.