2016-12-02 31 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 
      } 
     }); 

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

相关问题