2015-11-14 48 views
13

我正在開發一個應用程序使用asp.net,mvc6和angularjs在我的角度服務。當我向某個操作方法發出請求時,我沒有收到任何數據。 當我檢查的要求,我看得出來,造成了異常:「不正確的內容類型:」異常拋出角度mvc 6應用程序

  • 表 '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest)this.Request).FORM' 拋出一個異常類型的 'System.InvalidOperationException' Microsoft.AspNet.Http.IFormCollection {System.InvalidOperationException}

異常消息說"Incorrect Content-Type:application/json;charset=UTF-8"

我的角度服務

return $http({ method: 'POST', url: 'home/createEvent', eventDetails: event }) 
       .success(function(data, status, headers, config) { 
        return data; 
       }) 
       .catch(function(data, status, headers, config) { 
        console.log(data); 
       }); 

我控制器

[HttpPost] 
public IActionResult CreateEvent([FromBody]Event eventDetails) 
{ 
    return Json(new {dsd=""}, 
     new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()}); 

} 
+0

對此有何改進? –

+1

都能跟得上,但這個工作 'VAR是eventObj = JsonConvert.DeserializeObject (的Request.Form [ 「事件」]);'angule服務返回 '$ HTTP({ 網址: '主頁/ CreateEvent', 方法: 「POST」 ) data:$ .param({event:JSON.stringify(event) }), header:{'Content-Type':'application/x-www-form-urlencoded'} })。success deferred.resolve).error(deffered.reject);' – Gayan

回答

2

希望下面的例子就可以幫助你。

嘗試與

[Produces("application/json")] 
[Route("api/[controller]")] 

裝飾你的控制器既然你din't顯示控制器的名字,我會給你一個完整的虛擬工作示例

控制器

[Produces("application/json")] 
[Route("api/[controller]")]  
public class DashBoardLayoutApi : Controller 
{ 
    public DashBoardLayoutApi() 
    { } 

    [HttpPost] 
    public void Post([FromBody] LoginViewModel data) 
    { } 
} 

C#視圖模型

public class LoginViewModel 
{ 
    public string Email { get; set; } 
    public string Password { get; set; } 
} 

HTML/JS

<script> 
    var data = { 
     Email: 'Test', 
     Password: 'Test', 
     RememberMe: true 
    }; 

    $("#test").click(function() { 
     $.ajax({ 
      url: '/api/DashBoardLayoutApi', 
      type: 'POST', 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify(data),     
     }); 
    } 
</script> 
<button id="test"> Save Layout</button> 

結果

enter image description here enter image description here

+0

複雜對象也可以工作。 I.E .: public class LoginViewModel { public string Email {get;組; } public string Password {get;組; } public List MyOtherViewModel {get; set} } 只要您的js對象具有相同的屬性名稱並且屬性具有相同的名稱。 VAR數據= { 電子郵件: '測試', 密碼: '測試', 了rememberMe:真 MyOtherViewModel:[{屬性名: 「無所謂」},{屬性名:Whatever2},{屬性名: 「somethingelse」}] } ; – hidden

3

接受的答案並沒有爲我工作。對我來說,解決方案是給$ http呼叫添加一個標頭:

 $http({ 
       url: "/install", 
       method: "POST", 
       data: data, 
       headers: { 
        "Content-Type": "application/x-www-form-urlencoded" 
       } 
      }) 
      .success(...); 
+0

它怎麼可能,它沒有工作,我什至做屏幕截圖的結果.. – hidden

0

隱藏的答案很好。但是,即使在我的應用程序中實現了隱藏方法之後,我仍然在C#控制器中有空模型。在挖掘了一下後,我發現問題出在JS代碼中創建的不正確的客戶端模型上,這些模型無法在服務器上反序列化(null不能轉換爲Guid類型)。

出於某種原因,模型綁定不會在這樣的情況下拋出異常: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

當一個參數綁定,模型綁定尋找與該名稱值停止,並將其移動到下一個參數綁定。如果綁定失敗,MVC不會拋出錯誤。您可以通過檢查ModelState.IsValid屬性來查詢模型狀態錯誤。

所以,您在C#控制器ModelState.IsValid財產,以確保您通過有效的模型,並可能考慮使用自定義的模型綁定捕捉模型綁定錯誤並記錄它們。

相關問題