2016-02-03 6 views
-2

Я видел несколько потоков здесь, рассматривая аналогичную проблему, но, к сожалению, ничто не могло решить мою проблему (пока).Аргументы действия API-интерфейса API всегда равны нулю

CONTROLLER МЕТОД

Ниже мой метод контроллера:

[EnableCors("AllowAll")] 
[RouteAttribute("SearchBooks")] 
[HttpGet("searchbooks/{key}")] 
public async Task<object> SearchBooks(string key) 
{ 
    using (var cmd = _ctx.Database.GetDbConnection().CreateCommand()) 
    { 
     cmd.CommandText = "SearchBooks"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@Key", SqlDbType.NVarChar) { Value = key }); 

     if (cmd.Connection.State == ConnectionState.Closed) 
      cmd.Connection.Open(); 

     var retObj = new List<dynamic>(); 
     using (var dataReader = await cmd.ExecuteReaderAsync()) 
     { 
      while (await dataReader.ReadAsync()) 
      { 
       //Namespace for ExpandoObject: System.dynamic 
       var dataRow = new ExpandoObject() as IDictionary<string, object>; 

       for (var iFiled = 0; iFiled < dataReader.FieldCount; iFiled++) 
        dataRow.Add(dataReader.GetName(iFiled), dataReader[iFiled]); 

       retObj.Add((ExpandoObject)dataRow); 
      } 
     } 

     if (!retObj.Any()) 
      return JsonConvert.SerializeObject("No matching record found"); 
     else 
      return JsonConvert.SerializeObject(retObj); 
    } 
} 

Когда я проверяю консоль для вывода он говорит

неудачу: Microsoft.AspNet.Server.Kestrel [ 13] Необработанное исключение было брошено приложением. System.Data.SqlClient.SqlException (0x80131904): процедура или функция «SearchBooks» ожидает параметр «@Key», который не был предоставлен.

Я создал другой сайт на месте, специально для проверки проблемы CORS (который отлично работает). Я звоню выше метод с помощью AJAX следующим образом:

<script type='text/javascript'> 
$.ajax({ 
    type: "POST", 
    url: "http://localhost:5000/api/bookstore/SearchBooks", 
    data: { 'key': 'van' }, 
    dataType: 'json', 
    contentType:"application/json", 
    success: function (res) { 
    $("#response").html(res); 
    }, 
    error: function (err) { 

    } 
}); 
</script> 

Проблема значение аргумента key в методе контроллера SearchBooks всегда null!

Но если я создаю model (ниже)

МОДЕЛЬ

public class SearchViewModel{ 
    public string SearchKey {get; set;} 
} 

, а затем, если я изменить мой AJAX передать значение этому model как следующий, все работает просто отлично!

<script type='text/javascript'> 
    var searchModel={ 
    key: 'van' 
    } 

    $.ajax({ 
    type: "POST", 
    data: JSON.stringify(searhModel), 
    url: "http://localhost:5000/api/bookstore/searchbooks", 
    contentType:"application/json", 
    success: function (res) { 
     $("#response").html(res); 
    }, 
    error: function (err) { 

    } 
}); 
</script> 

Помогите!

+1

Не могли бы вы хотя бы попытаться правильно отформатировать код? Ваш первый блок не читается. –

+0

Хорошо. Дай мне попробовать. –

+0

Попробовал переформатировать первый фрагмент кода, но он по-прежнему выглядит не очень аккуратно :(Извините за это –

ответ

0

Когда параметр имеет [FromBody], веб-API использует заголовок Content-Type для выбора форматирования.

public async Task<object> SearchBooks([FromBody]string key){ 

} 

Пожалуйста, обратитесь Parameter Binding in ASP.NET Web API

+1

@CodeCaster: Обновлен ответ –

+0

На самом деле я попробовал '[FromBody]' уже, но это не сработало для меня. –

+0

@NiladriSarkar: Можете ли вы ударить по методу SearchBooks в отладочный режим? –

1

Использование type: "GET" в вашем АЯКС вызова

и ваш URL должен выглядеть следующим образом url: "http://localhost:5000/api/bookstore/SearchBooks/van" и, наконец, удалить data

окончательный код:

$.ajax({ 
    type: "GET", 
    url: "http://localhost:5000/api/bookstore/SearchBooks/van", 
    dataType: 'json', 
    contentType:"application/json", 
    success: function (res) { 
    $("#response").html(res); 
    }, 
    error: function (err) { 

    } 
}); 
0

в соответствии с вашей проблемой кажется, что ваш формат json недействителен, когда вы используете stringify, он генерирует корректный json, следовательно, он отлично работает. Поэтому попробуйте удалить qouts из «ключа» в ваш вызов ajax. например

<script type='text/javascript'> 
$.ajax({ 
    type: "POST", 
    url: "http://localhost:5000/api/bookstore/SearchBooks", 
    data: { key: 'van' }, 
    dataType: 'json', 
    contentType:"application/json", 
    success: function (res) { 
    $("#response").html(res); 
    }, 
    error: function (err) { 

    } 
}); 
</script> 
Смежные вопросы