2014-02-19 96 views
0

我已经使用了这个函数并检查了所有的StackOverflow,但我必须缺少一些东西......我有一个简单的按钮点击隐藏的不显眼的jQuery。它计算复选框并将每个选中的框的值添加到数组中。当我在jQuery中使用警告框时,该列表是正确的,但数组从未将其发送到控制器端。该代码流向控制器,但我打破了var resolutionViewModel = new ResolutionViewModel();并检查trans - 参数为null。我是jQuery的新手,可以真正使用这里的帮助。无法将数组从jQuery发送到MVC 4控制器

jQuery的

// Return the selected transactions 

function resolveTransactions() { 

    $('#btnResolve').click(function() { 

     var selectedTransactions = new Array(); 

     $('input[name="chkTransaction"]:checked').each(function() { 
      selectedTransactions.push(this.value); 
     }); 

     if (selectedTransactions.length > 0) { 
      $.ajax({ 
       type: 'POST', 
       dataType: 'json', 
       url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay', 
       contentType: 'application/json; charset=utf-8', 
       data: {trans : selectedTransactions}, 
       traditional: true, 
       success: function (data) { alert(data); }, 
       error: function(xhr, status, errorThrown) { alert("Error: " + errorThrown); } 
      }); 
     } 
    }); 
}; 

控制器侧

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(List<string> trans) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
+0

我还看到错误提示框,上面写着一个错误的翻译: –

+0

只是注意的是,错误回调需要3个参数按照下面的顺序:xhr,status,errorThrown,所以我会改变你的错误处理程序,所以传入这些参数并警告,而不是转换为字符串的xhr,就像你注意到的那样显示[object Object]。 – Dismissile

+0

@Dismissile你的意思是这样的: error:function(xhr,status,errorThrown){alert(“Status:”+ status +“Error:”+ errorThrown); } - 如果是这样,它只是说错误:找不到。 –

回答

0

SOLUTION: $ .ajax回发未将格式正确的数据发送到控制器。我通过使用IE中的网络选项卡并查看发布的http的请求主体来发现此问题。它看起来像这样:transaction_table_length = 10 & chkTransaction = 22 & chkTransaction = 23 - 它应该看起来像这样:{“trans”:[“22”,“23”]}。为了解决这个问题,我按如下所示对属性名和数组进行了字符串化,将dataType更改为'text',并使controller action方法中的参数采用String [] trans。

jQuery的

// Return the selected transactions 
function resolveTransactions() { 
    $('#btnResolve').click(function() { 

     var selectedTransactions = new Array(); 

     $('input[name="chkTransaction"]:checked').each(function() { 
      selectedTransactions.push(this.value); 
     }); 

     if (selectedTransactions.length > 0) { 
      $.ajax({ 
       type: 'POST', 
       dataType: 'text', 
       url: 'http://localhost/AuditLog/Home/ResolutionFormDisplay', 
       contentType: 'application/json; charset=utf-8', 
       data: JSON.stringify({ trans:selectedTransactions }), 
       traditional: true, 
       success: function (data) { alert(data); }, 
       error: function(xhr, status, errorThrown) { alert(" Error: " + errorThrown); } 
      }); 
     } else { 
      alert('You must select (check) at least one transaction to apply a resolution.'); 
      return false; 
     } 
     return false; 
    }); 
}; 

MVC 4控制器动作

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(string[] trans) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
2

试着让你的控制器接受一个列表,而不仅仅是一个单一的字符串(因为你没有传递一个字符串):

[HttpPost] 
public PartialViewResult ResolutionFormDisplay(List<string> value) 
{ 
    var resolutionViewModel = new ResolutionViewModel(); 

    // fill Usernames dropdown selector in ViewModel 
    // fill Status dropdown selector in ViewModel 
    // fill list of transactionIds in ViewModel 

    return PartialView("_ResolutionDialog", resolutionViewModel); 
} 
+0

我做了改变科林和重新启动后没有区别。 (还是)感谢你的建议。 –

1

发布的JSON需要在您的控制器方法中命名属性与参数匹配。检查Chrome浏览器开发工具的“网络”选项卡,看到你发布什么,它可能是这样的:

"{\"value\":\"...\"}" 

没有value属性来传递给你的控制器方法的参数value。我认为最好的办法就是摆脱“JSON.stringify”并接受一个像Colin的答案这样的列表,但是如果你想把它作为一个字符串,JSON字符串需要是一个对象的value属性,而不是周围的其他方法:

data: {value : JSON.stringify(selectedTransactions)}, 
+0

我摆脱了JSON.Stringify并将签名更改为列表但行为没有变化。试用Goggle Chrome网络标签并在标题中输入数据列出数据。 –

+0

杰森,谷歌浏览器中的数据列出如下: transaction_table_length = 10&chkTransaction = 22&chkTransaction = 23&chkTransaction = 24&chkTransaction = 25&chkTransaction = 26&chkTransaction = 27&chkTransaction = 28&chkTransaction = 29&chkTransaction = 30&chkTransaction = 31 –

0

尝试通过你的阵列如下:

data:"{'trans':" + JSON.stringify(selectedTransactions)+"}" 

你的方法应该如下:

public void Method(List<string> trans) 
{ 
    //Your implementation 
} 
+0

对不起,这是没有效果的。 –

相关问题