2017-07-06 81 views
0

我在那裏我嘗試後基因敲除模型的控制器動作:淘汰賽視圖模型來空

[HttpPost] 
    public void AddItems(MyViewModel model) 
    { 
     [...] 
    } 

淘汰賽行動:

self.AddItems = function (data, event) { 
    var url = "/MyController/AddItems"; 
    var target = event.target || event.srcElement; 
    var model = ko.toJSON(self); 
    $.post(url, 
      model, 
      function (result) { 

      }) 
     .success(function() { console.log("AddItems second success"); }) 
     .error(function() { console.log("AddItems error"); }) 
     .complete(function() { console.log("AddItems complete"); }); 

    // this doesn't work either 
    //var model2 = ko.toJSON({ model: self }); 
    //$.ajax(url, { 
    // data: model, 
    // type: "post", 
    // async: false, 
    // contentType: "application/json", 
    // success: function (data) { 
    //  console.log("AddItems second success"); 
    // }, 
    // error: function (xmlHttpRequest, textStatus, errorThrown) { 
    //  console.log("AddItems error"); 
    // } 
    //}); 
} 

我註釋掉了另一篇文章我也嘗試過這個動作 - 這個動作根本沒有達到控制器動作,在js控制檯中返回500錯誤。

型號:

public class MyViewModel 
{ 
    public int Id { get; set; } 

    public string Ref { get; set; } 

    public List<ItemViewModel> Items { get; set; } 

    public decimal PriceTotal { get; set; } 
} 

的模型,它被張貼到行動具有正確的結構,但所有屬性是空或空。

如何使用正確的對象數據將挖空視圖模型傳遞給動作?

***** 編輯 *****

我認爲動作沒有得到JSON模式。

因爲當我通過一個手寫的原始對象模型:

var model4 = { 
    "Ref": "sgsgsasg", 
    "Id": 1, 
    "PriceTotal": 382 
} 

它得到很好的行動,並用正確的值。

雖然淘汰賽傳遞json,然後該動作無法將其轉換爲mvc模型。

+0

我用這個例子中的http:// WWW .c-sharpcorner.com/UploadFile/5ff76e/posting-data-to-mvc-action-using-knockoutjs /從json反序列化模型並使用'{model:ko.toJSON(self)}'將它傳遞給動作 – nickornotto

回答

0

你沒有通過你的網址期望參數,因此500

self.AddItems = function (data, event) { 
    var url = "/MyController/AddItems"; 
    var target = event.target || event.srcElement; 
    $.ajax(url , { 
     type: "POST", 
     cache: false, 
     data: { model: ko.toJSON(self) } 
    }).done(function() { 
     console.log("AddItems second success"); 
    }).fail(function (jqXHR, textStatus, errorThrown) { 
     console.log("AddItems complete"); 
    }); 
} 

控制器

[HttpPost] 
public void AddItems(string model) 
{ 
    var audit = InsertAudit(); 
    try 
    { 
     MyViewModel data = JsonConvert.DeserializeObject<MyViewModel>(model); 
     //Logic here 
    } 
    catch (Exception ex) 
    { 
     FailAudit(audit.ID, ex.ToString()); 
    } 
} 
+0

它沒有得到反序列化正確然後,請參閱編輯,我其實更喜歡這種方式,因爲您可以在反序列化之前審覈數據,因此如果它摔倒了,您可以捕獲異常並記錄下來,以免丟失數據。 –

+0

這會觸發操作,但模型對象爲null – nickornotto

1

我敢肯定你是唯一缺少的內容類型標題。

默認情況下,jQuery發佈數據爲application/x-www-form-urlencoded。你想要application/json。 jQuery的$.ajax()可以配置內容類型:

self.AddItems = function() { 
    return $.ajax({ 
     url: "/MyController/AddItems", 
     data: ko.toJSON(self), 
     contentType: "application/json" 
    }) 
    .done(function() { console.log("AddItems success"); }) 
    .fail(function() { console.log("AddItems error"); }) 
    .always(function() { console.log("AddItems complete"); }); 
} 

邊注:從函數返回的請求,您可以更別處的行爲附加到它:

self.something = function() { 
    // do some work on the viewmodel 
    self.AddItems().done(function() { 
     // we are done 
    }); 
} 
+0

這將返回500錯誤,並且調試程序無法訪問操作,問題位於內容類型以外的其他位置 – nickornotto

+0

服務器必須爲該錯誤提供一些*詳細信息。你有沒有檢查迴應? – Tomalak