【问题标题】:Treat empty query string parameters as empty strings, without using a class for parameters将空查询字符串参数视为空字符串,而不使用参数类
【发布时间】:2016-03-12 13:17:18
【问题描述】:

我正在尝试将多个参数传递给 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 方法,如第二个代码 sn-p 所示。我遇到的问题是空字符串参数将被转换为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

如果我将搜索功能更改为使用第一个代码 sn-p 中的类,它将按我的意愿工作,但我真的尽量避免长期使用类作为 api 参数。

【问题讨论】:

  • 我正在尝试了解您的预期结果。在您的示例中,您是否希望参数未绑定它们设置为空字符串而不是null
  • 你试过DefaultValueAttribute吗?比如:[DefaultValue("")] public string initiation_year { get; set; }
  • @Nkosi 我所追求的是将参数设置为我传入的确切内容,即。如果我传入一个空字符串,我希望它是一个空字符串,此刻,如果我传入一个空字符串,参数值将为null
  • @Khanh_TO 具有 displayformat 属性的类正在工作,我不想创建一个类,我只想使用第二个代码 sn-p 中所示的单个参数
  • 我从您的问题中得到了答案(=现在使用:ConvertEmptyStringToNull = false)。不错!

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


【解决方案1】:

好的,我按照我想要的方式完成了这项工作。我不得不修改一些我为 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;
    }
}

【讨论】:

    【解决方案2】:

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

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

    看看下面的文章,看看能不能帮到你

    Parameter Binding in ASP.NET Web API

    【讨论】:

    • 这是设计使然。我不想要默认行为。我知道您可以创建自定义格式化程序等来覆盖 web api 行为,但我不知道在仅使用原始类型作为参数时尝试覆盖将空字符串参数更改为 null 的默认行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多