解析JSON对象,通过ajax将参数传递给C#MVC3控制器中的通用列表

时间:2012-04-24 07:20:46

标签: c# jquery asp.net-mvc json

我有一点jquery代码:

     //foreach the inputs
         json.push({
                 Var1: $(this).attr("id"),
                 Var2: filename,
                 Var3: hash_name
              });
      //end foreach

      $.post(url, {test: json}, function(){}, 'json');

我们假设json有3个对象(在浏览3个输入并获取它们的值之后)。以及MVC3模型中的结构:

public struct Simple
   {
      public string Var1 {
         get;
         set;
      }

      public string Var2{
         get;
         set;
      }

      public string Var3{
         get;
         set;
      }

      public bool Var4 {
         get;
         set;
      }
   }

和控制器:

 [HttpPost]
 public ActionResult Test( List<Simple> test) {
   ...
 }

List<Simple>返回3个元素(这里是正确的),但所有属性的值都为null(Var4除外,它是假的)。

为什么?

2 个答案:

答案 0 :(得分:1)

名称应该是这样的(Json键值)

test[0].Var1
test[0].Var2
test[0].Var3

test[1].Var1
.....

Or

[0].Var1
[0].Var2
[0].Var3
......

服务器无法关联构成每个对象的属性的想法,因此该数字仅用于分组

Var4为false,因为模型绑定器使用其默认值实例化它,它没有从表单中读取任何值


实施例

<强>的Javascript

json.push({
                 'test[0].Var1': $(this).attr("id"),
                 'test[0].Var1': filename,
                 'test[0].Var1': hash_name
              });

你应该增加每个对象的0

JavaScript中的名称test必须与操作方法的参数名称匹配

答案 1 :(得分:1)

如果你想做的是ModelBinding,那么还需要做更多的工作。但是,如果您只是想在服务器端使用json数组,那么这里就是一个快速的黑客攻击。 下载 System.Json (您可以通过NuGet进行)。 在客户端不发送JSON对象,因为这需要一个完全不同的方法。而是在手前将其字符串化

    $(document).ready(function () {
        var json = [

            {
                Name: "John Doe",
                Age: 34
            }];
        var str = JSON.stringify(json);
        console.log(str);
        $.ajax({
            url: '/mycontroller/LoadJson',
            data: { values: str },
            type: 'POST',                
            success: function (data) {                   
              //do something
            }
        });
    });

在服务器端,您可以将JsonValue.Parse用于动态对象(然后您可以“翻译”到您的一个自定义对象)

    [HttpPost]
    public ActionResult LoadJson(FormCollection collection)
    {
        dynamic values = JsonValue.Parse(collection["values"]);       
        for(int i = 0; i < values.Count; i++)
        {
            var _output = string.Format("My name is {0} and I'm {1} of age", values[i].Name, values[i].Age);
            Console.WriteLine(_output);
        }
        return RedirectToAction("Index");
    }

这是关于动态Json解析的更长篇篇幅 http://www.west-wind.com/weblog/posts/2012/Mar/19/Dynamic-JSON-Parsing-in-NET-with-JsonValue

希望这有帮助