2016-12-02 52 views
1

我有一個對象在我的JavaScript中聲明,我想發送到我的控制器。目的是VMInterface類型,看起來像:未在MVC控制器調用中填充內部對象

public class VMInterface 
{ 
    public string Name { get; set; } 
    public int SourceID { get; set; } 
    public int ProjectID { get; set; } 
    public string Description { get; set; } 
    public VMConnection VMConnection { get; set; } 
    public List<VMInteraction> Interactions { get; set; } 

} 

public class VMConnection 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string Connection { get; set; } 
} 

public class VMInteraction 
{ 
    public string Name { get; set; } 
    public List<VMField> Fields { get; set; } 
} 

public class VMField 
{ 
    public string InputOutput { get; set; } 
    public string Name { get; set; } 
    public int DataTypeID { get; set; } 
} 

我的控制器:

[HttpGet] 
public JsonResult UpdateVM(VMInterface vm) 
{ 
    return null; 
} 

我的控制器調用:

$.ajax({ 
    url: '/Admin/UpdateVM', 
    type: 'GET', 
    data: { 
     Name: "Test Name", 
     Description: "Test Desc", 
     SourceID: 1, 
     ProjectID: 4, 
     VMConnection: { 
      Connection: "IPAddress goes here", 
      Username: "Username", 
      Password: "Password" 
     }, 
     Interactions: [{ 
      Name: "Method", 
      Fields: [{ 
       InputOutput: "INPUT OR OUTPUT HERE", 
       Name: "DROP LOCATION HERE", 
       DataTypeID: 1 
      }], 

     }] 
    }, 
    success: function (response) { 
     //Do nothing 
    } 
}); 

我有雙重檢查,所有的字段名相匹配並且我VMInterface課程中的屬性全部公開,並且{ get; set; }。我的電話打在我的控制器上,並且所有頂層(ei NameDescriptionSourceIDProjectID)字段映射正確。但是,對於我的VMConnectionInteractions字段,信息未被填充。

enter image description here enter image description here

有什麼我缺少獲得這些正確映射?

+1

您需要字符串化數據 - '數據:JSON.stringify {VM:數據}'和'設置的contentType:「應用/ json','或者使用點符號來命名屬性以匹配您的模型,例如'VMConnection.Connection:'IPAddress go here''和'Interactions [0] .Name:'Method'等 –

+0

謝謝您的評論,不幸的是他們都沒有工作。第一種方法返回null,第二種方法在Visual Studio中拋出錯誤 – Novastorm

+0

然後你做得不對! –

回答

1

因爲您將數據發送到GET方法,所以必須生成值作爲查詢字符串,這意味着名稱/值對必須與您的模型結構相匹配。屬性名稱需要使用與您在服務器中訪問屬性相同的點符號。

如果你想獲得的InputOutput在您的POST方法的第VMInteraction的第一VMField值,你可以使用

var value = vm.Interactions[0].Fields[0].InputOutput 

由於參數的名稱是vm,只是帶,其前綴和這是你的數據需要如何,所以你的AJAX調用會

$.ajax({ 
    .... 
    data: { 
     Name: "Test Name", 
     Description: "Test Desc", 
     .... 
     VMConnection.Connection: "IPAddress goes here", 
     VMConnection.Username: "Username", 
     .... 
     Interactions[0].Name: "Method", 
     Interactions[0].Fields[0].InputOutput: "INPUT OR OUTPUT HERE", 
     .... 
    }, 

注意,這將創建一個醜陋的查詢字符串,還有就是你可能會超過查詢字符串風險限制並拋出異常,因此使用type: 'Post',並標記方法[HttpPost]會更合適。

另一種選擇是按照原樣使用JavaScript對象,將其字符串化並將其作爲contentType: 'application/json'發送。這意味着它必須是POST,因爲GET沒有主體。然後,您的Ajax調用將

$.ajax({ 
    url: '/Admin/UpdateVM', 
    type: 'Post', // must be a post 
    contentType: 'application/json;charset=utf-8', // set contentType 
    data: JSON.stringify(vm : { // stringify the data 
     Name: "Test Name", 
     Description: "Test Desc", 
     SourceID: 1, 
     ProjectID: 4, 
     VMConnection: { 
      Connection: "IPAddress goes here", 
      Username: "Username", 
      Password: "Password" 
     }, 
     Interactions: [{ 
      Name: "Method", 
      Fields: [{ 
       InputOutput: "INPUT OR OUTPUT HERE", 
       Name: "DROP LOCATION HERE", 
       DataTypeID: 1 
      }], 

     }] 
    }}), 

,改變方法是[HttpPost]

+0

很好的答案,真正解釋清楚!非常感謝 – Novastorm

0

請嘗試像這樣。

操作方法:(HTTPGET到HttpPost)

[HttpPost] 
public JsonResult UpdateVM(VMInterface vm) 
{ 
     return null; 
} 

的Javascript:

var myData = { 
      Name: "Test Name", 
      Description: "Test Desc", 
      SourceID: 1, 
      ProjectID: 4, 
      VMConnection: { 
       Connection: "IPAddress goes here", 
       Username: "Username", 
       Password: "Password" 
      }, 
      Interactions: [{ 
       Name: "Method", 
       Fields: [{ 
        InputOutput: "INPUT OR OUTPUT HERE", 
        Name: "DROP LOCATION HERE", 
        DataTypeID: 1 
       }], 

      }] 
     } 

    $.ajax({ 
      url: '/Admin/UpdateVM', 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      type: "POST", 
      data: JSON.stringify(myData),     
      success: function (response) { 
       //Do nothing 
      } 
     }); 

它的正常工作!!!!!!!