Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在没有表单的情况下将字符串数组发布到ASP.NET MVC控制器?_Jquery_Asp.net Mvc_Json - Fatal编程技术网

Jquery 如何在没有表单的情况下将字符串数组发布到ASP.NET MVC控制器?

Jquery 如何在没有表单的情况下将字符串数组发布到ASP.NET MVC控制器?,jquery,asp.net-mvc,json,Jquery,Asp.net Mvc,Json,我正在创建一个小应用来自学ASP.NETMVC和JQuery,其中一个页面是一个项目列表,其中一些项目可以选择。然后我想按下一个按钮,使用JQuery的Post函数向我的控制器发送一个列表(或类似的东西),其中包含所选项目的ID 我设法得到了一个包含所选元素ID的数组,现在我想发布它。我可以这样做的一种方法是在我的页面中有一个带有隐藏值的虚拟表单,然后用所选项目设置隐藏值,然后发布该表单;不过,这看起来很粗糙 有没有更干净的方法来实现这一点,直接将阵列发送到控制器?我尝试了一些不同的方法,但看起

我正在创建一个小应用来自学ASP.NETMVC和JQuery,其中一个页面是一个项目列表,其中一些项目可以选择。然后我想按下一个按钮,使用JQuery的Post函数向我的控制器发送一个列表(或类似的东西),其中包含所选项目的ID

我设法得到了一个包含所选元素ID的数组,现在我想发布它。我可以这样做的一种方法是在我的页面中有一个带有隐藏值的虚拟表单,然后用所选项目设置隐藏值,然后发布该表单;不过,这看起来很粗糙

有没有更干净的方法来实现这一点,直接将阵列发送到控制器?我尝试了一些不同的方法,但看起来控制器无法映射它接收的数据。以下是迄今为止的代码:

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
然后我的控制器看起来像这样

public ActionResult GenerateList(List<string> values)
{
    //do something
}
公共操作结果生成列表(列表值)
{
//做点什么
}
我得到的只是控制器参数中的一个“null”


有什么提示吗?

不要将数据作为数组发布


您不应该需要表单来执行此操作。您只需要一个键/值对列表,您可以将其包含在对$.post的调用中。

我修改了我的响应,以包含我所做的测试应用程序的代码

更新:我已经更新了jQuery,将“传统”设置设置设置为true,以便再次工作(根据@DustinDavis的回答)。

首先是javascript:

function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };

    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}
下面是我的控制器类中的代码:

public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}
public JsonResult存储列表(列表值)
{
返回Json(新的{Result=String.Format(“列表中的第一项:{0}',值[0])));
}

当我调用该javascript函数时,我会收到一条警告:“列表中的第一项:'item1'”。希望这有帮助

FYI:JQuery改变了他们序列化post数据的方式

您必须将“传统”设置设置为true,否则

{ Values : ["1", "2", "3"] }
将作为

Values[]=1&Values[]=2&Values[]=3
而不是

Values=1&Values=2&Values=3

这个答案对我的处境帮助很大,所以谢谢你。 然而,为了将来的参考,人们应该绑定到一个模型,然后进行验证。PhilHaack的这篇文章描述了MVC2的这一点


希望这对某人有所帮助。

谢谢大家的回答。另一个快速解决方案是使用jQuery.param方法,将传统的参数设置为true,将JSON对象转换为字符串:

$.post("/your/url", $.param(yourJsonObject,true));
正如我所讨论的

如果您想将自定义JSON对象传递给MVC操作,那么您可以使用这个解决方案,它就像一个符咒

public string GetData() {
  // InputStream contains the JSON object you've sent
  String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

  // Deserialize it to a dictionary
  var dic =
    Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < String,
    dynamic >> (jsonString);

  string result = "";

  result += dic["firstname"] + dic["lastname"];

  // You can even cast your object to their original type because of 'dynamic' keyword
  result += ", Age: " + (int) dic["age"];

  if ((bool) dic["married"])
    result += ", Married";

  return result;
}
公共字符串GetData(){
//InputStream包含您发送的JSON对象
String jsonString=newstreamreader(this.Request.InputStream.ReadToEnd();
//将其反序列化为字典
变量dic=
Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString);
字符串结果=”;
结果+=dic[“名字”]+dic[“姓氏”];
//由于“dynamic”关键字,您甚至可以将对象强制转换为其原始类型
结果+=”,年龄:“+(int)dic[“年龄”];
如果((bool)dic[“已婚”])
结果+=“,已婚”;
返回结果;
}
此解决方案的真正好处是,您不需要为每个参数组合定义新的类,此外,您可以轻松地将对象转换为其原始类型

您可以使用类似这样的助手方法来方便您的工作:

public static Dictionary < string, dynamic > GetDic(HttpRequestBase request) {
  String jsonString = new StreamReader(request.InputStream).ReadToEnd();
  return Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < string, dynamic >> (jsonString);
}
publicstaticdictionaryGetDic(HttpRequestBase请求){
String jsonString=newstreamreader(request.InputStream.ReadToEnd();
返回Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString);
}

.NET4.5
mvc5

Javascript:

JS中的对象:

这是一种不起作用的机制

    $('.button-green-large').click(function() {
        $.ajax({
            url: 'Quote',
            type: "POST",
            dataType: "json",
            data: JSON.stringify(document.selectedProduct),
            contentType: 'application/json; charset=utf-8',
        });
    });
C#

对象:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List<ClaimedFee> ClaimedFees { get; set; }
}

public partial class ClaimedFee //Generated by EF6
{
    public long Id { get; set; }
    public long JourneyId { get; set; }
    public string Title { get; set; }
    public decimal Net { get; set; }
    public decimal Vat { get; set; }
    public string Type { get; set; }

    public virtual Journey Journey { get; set; }
}
收到的对象:


希望这能为您节省一些时间。

另一个同样适用于对象列表而不仅仅是字符串的实现:

JS:

假设“selectedValues”是对象数组

在控制器中,参数是相应ViewModels的列表

public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}
public JsonResult存储列表(列表值)
{    
返回Json(新{
Result=String.Format(“列表中的第一项:{0}',值[0].Name”)
});
}

您可以使用

jQuery.ajaxSettings.traditional = true;

谢谢更新后的url是:很好,我找到了这个答案,现在我可以发送Guid数组,操作将它们接收到列表中。感谢这里要注意的两件重要事情。1) dataType:“json”2.)traditional:true。如果没有它们,字符串数组将不会传递给操作方法,因为
dataType:'json'
会导致jQuery尝试将响应解析为json,如果它不是有效的JSON,则将出错。@Thanigainathan
数据类型:“JSON”
用于返回类型,不需要将数组发送到操作
contentType:“application/json;charset=utf-8”
,是一个,但在某些情况下不是必需的。@emzero使用
var postData={id:45,[{myClassProp1:1,myClassProp2:2},{}…],另一个参数:“some string”}$.ajax({…,传统:true})
将有助于恢复到传统的序列化。为了使ASP.NET MVC路由正确地使用一个简单的字符串值js数组,我需要它。您的答案非常有用。我有同样的情况,但它是与
ints
。当我使用
traditional:true
时,它是有效的,您的答案和链接解释了它的原因。当我使用
键入:“POST”
,而不使用
traditional:true
时,它也可以工作。为什么呢?你能详细说明一下吗。仅供参考,我正在使用Asp.Net Mvc。在Asp.Net中有没有办法解析这样一个没有索引的匿名数组?值[]=1和值[]=2和值
public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}
jQuery.ajaxSettings.traditional = true;