2017-07-06 8 views
0

来アクションに渡さをViewModelにこれも私が試したアクションです - これはコントローラーの動作にはまったく到達せず、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; } 
} 

モデルアクションに掲載されます正しい構造を持っていますが、すべてのプロパティが空またはnullのいずれかです。

正しいオブジェクトデータを持つアクションにノックアウトビューモデルを渡すにはどうすればよいですか?

***** EDIT *****

私はアクションがJSONモデルを取得していないと思います。

ので、私は手に書かれた生のオブジェクトモデルを渡すとき:

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

それがうまくアクションにし、正しい値を取得します。

ノックアウトがjsonを通過している間に、アクションでmvcモデルに変換できません。

+0

私はこの例にhttpを使用jQueryの$.ajax()は、コンテンツの種類を設定できます.c-sharpcorner.com/UploadFile/5ff76e/posting-data-to-mvc-action-using-knockoutjs /を使用してjsonからモデルを逆シリアル化し、{model:ko.toJSON(self)}を使用してアクションに渡します – nickornotto

答えて

0

あなたのURLが期待されるパラメータ、私はあなただけのコンテンツタイプヘッダーが欠落しているかなり確信している

[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

これはアクションをヒットしますが、モデルオブジェクトはヌルになります – nickornotto

1

ので、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"); 
    }); 
} 

コントローラを経過していません。

デフォルトでは、jQueryはデータをapplication/x-www-form-urlencodedと表示します。あなたはapplication/jsonが欲しいです。

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"); }); 
} 

サイドノート:関数からの要求を返すことは、あなたが他の場所でそれをより多くの行動を添付することができます:// WWW:

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

これは500エラーを返し、デバッガはアクションに到達しません。コンテンツタイプ以外の場所に問題があります – nickornotto

+0

サーバはエラーのある*詳細を与える必要があります。あなたは応答を確認しましたか? – Tomalak

関連する問題