2016-02-03 79 views
-2

我在這裏看到了一些線程來解決類似的問題,但不幸的是沒有任何東西可以解決我的問題(到目前爲止)。Web API控制器的動作參數始終爲空

控制器方法

以下是我的控制器方法:

[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]時,Web API將使用Content-Type標題來選擇格式化程序。

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

} 

請在您的Ajax調用

參考Parameter Binding in ASP.NET Web API

+1

@CodeCaster:更新了答案 –

+0

其實我已經嘗試過'[FromBody]',但是這對我沒有任何作用。 –

+0

@NiladriSarkar:你是否能夠點擊SearchBooks方法調試模式? –

1

使用type: "GET"和您的網址應該是這樣的 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因此它工作正常。所以嘗試從ajax調用中的'key'中刪除qout。例如

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