2017-07-06 159 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