2016-03-12 5 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; } 
} 

Но я абсолютно чертов ненависть идея того, чтобы создать класс за один раз от использования.

Ive провело много исследований и действительно изо всех сил пытаюсь найти способ изменить поведение по умолчанию, отличное от предыдущего. Я просто хочу, чтобы это сделать:

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

Я пропускаю легко, как изменить это поведение по умолчанию или то, что я должен смотреть на то, чтобы impelement собственной строки запроса анализатора, который я могу применить в глобальном масштабе?

Благодаря

Update

Там, кажется, некоторая путаница в моем посте, извините, если я не был ясен. Я попытаюсь прояснить.

Я хочу передать только простые примитивные типы в свой метод HttpGet, как показано во втором фрагменте кода. Проблема в том, что пустые параметры строки будут преобразованы в нуль.

ie. this url: http://localhost/api/cutting/search?batch_number=&filter=&intiation_month=Jan&initiation_year=2016 

будет производить следующие значения в апи:

batch_number = null 
filter = null 
initiation_month = Jan 
initiation_year = 2016 

Если изменить функцию поиска, чтобы использовать класс в первом фрагменте кода, он будет работать, как я хочу, но Im действительно пытается чтобы избежать использования классов для параметров api в долгосрочной перспективе.

+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

Это по дизайну. Я не хочу поведения по умолчанию. Я знаю, что вы можете создавать пользовательские форматиры и т. Д., Чтобы переопределить поведение веб-api, но я не знаю, на что смотреть, чтобы попытаться переопределить это поведение по умолчанию при изменении пустых параметров строки до нуля, когда просто используют примитивные типы в качестве параметров – crazyhor77

Смежные вопросы