2016-03-12 146 views
3

我想通过多个参数传递给一个httpget web api函数。我遇到的关键问题是空查询字符串参数正在转换为空。web api空查询字符串参数

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

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方法,如第二个代码片段所示。我遇到的问题是空字符串参数将被转换为空。

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 

如果我改变了搜索功能,使用类的第一个代码段,它会工作,我想,但我真的努力避免长期使用类参数。

+0

我想了解您预期的结果。在你的例子中,是否你想要的是参数没有被绑定,它们被设置为空字符串而不是'null'? – Nkosi

+0

你尝试过'DefaultValueAttribute'吗?例如:'[DefaultValue(“”)] public string initiation_year {get;组; }' –

+0

@Nkosi我后来的是,参数设置为精确的,我传入,即。如果我传入一个空字符串,我希望它是一个空字符串,此刻,如果我传入一个空字符串,参数值将为空 – crazyhor77

回答

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

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

,如果它是一个简单的值类型一样int哪里会该值设置为0

同样会发生看一看下面的文章,看看它是否能帮助你

Parameter Binding in ASP.NET Web API

+0

它是由设计。我不想要默认行为。我知道你可以创建自定义的格式化程序等来覆盖web api行为,但我不知道该怎么看才能尝试并重写此默认行为,将仅当使用基本类型作为参数时将空字符串参数更改为null – crazyhor77

相关问题