1

我有一个小 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) {
   ...
 }

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

为什么 ?

4

2 回答 2

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

希望这可以帮助

于 2012-04-24T16:08:03.697 回答
1

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

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

test[1].Var1
.....

Or

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

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

并且Var4是假的,因为模型绑定器用它的默认值实例化了它,它没有从表单中读取任何值


前任

Javascript

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

你应该0为每个对象增加

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

于 2012-04-24T07:48:26.010 回答