【问题标题】:Binding MVC model in controller which has a complex array在具有复杂数组的控制器中绑定 MVC 模型
【发布时间】:2012-11-03 05:46:29
【问题描述】:

我的大部分模型都是使用$('form').serializeArray() 填充的,但是需要从其管理器填充形成分页网格的对象数组。 例如:

public JsonResult SubmitForm(MyViewModel input)
{

...

public class MyViewModel
{
  [Display(Name = "Name")]
  public string GridName { get; set; }

  [Display(Name = "Description")]
  public string GridDescription { get; set; }

  public GridRow[] GridRows { get; set; }

名称和描述将由serializeArray() 获取,没有问题。如果GridRowstring[],那么它接受我只需将多个实例推送到jquery 制作的序列化数组中:

var data = $('form').serializeArray();
for (var i in gridData) {
   data.push({ name: 'GridRows', value: gridData[i].id });
}
$.ajax({
   type: "POST",
   url: '/Central/Results/SubmitForm',
   dataType: "json",
   data: data,

这样我至少可以得到一个 ID 数组。但是,当我想填充正确的数据类型时,它不允许我将整个对象推入其中 (gridData[i])。当它到达控制器时,我总是得到一个空值。

知道我需要如何处理数据以使 MVC 正确填充模型吗?谢谢。

【问题讨论】:

  • 如果您要发送多行,那么我会说您要发送多个模型。您需要将控制器签名更改为 public JsonResult SubmitForm(IEnumerable<MyViewModel> input)
  • 模型中只有1个名称和描述,但是很多行。所以它在一个模型中有很多模型。

标签: javascript asp.net-mvc asp.net-mvc-3 jquery


【解决方案1】:

我很确定这与必须在您的 Ajax 帖子中将 traditional 选项设置为 true 有关。就将数组发布到 MVC 控制器操作而言,jQuery 处理数组的方式与您预期的略有不同。

这样做:

$.ajax({
   type: "POST",
   url: '/Central/Results/SubmitForm',
   dataType: "json",
   traditional: true,
   data: data,
   ...

更多详情请见this answer

【讨论】:

    【解决方案2】:

    原来只需要添加一行和属性引用,并分别添加每个变量。

            for (var i in gridData) {
               for (var j in gridData[i]) {
                  data.push({ name: 'GridRows[' + i + '].' + j, value: gridData[i][j] });
               }
            }
    

    编辑:只是想我会发布我不久前为此编写的更新的辅助方法。

    function serializeArray(obj, data, name) {
       /// <summary>Turns an object into an MVC standard array of values </summary>
       /// <param name="obj" type="Object">Object to serialise (required)</param>
       /// <param name="data" type="Array">Array to append data to end of (optional)</param>
       /// <param name="name" type="String">Name prefix for all entries (optional/ignore)</param>
    
       if (!data || !(data instanceof Array)) {
          data = [];
       }
       if (obj instanceof Array) {
          if (!name) {
             throw "Need an object name when converting an array";
          }
          for (var index = 0; index < obj.length; index++) {
             data = serializeArray(obj[index], data, name + '[' + index + ']');
          }
       } else if (obj instanceof Object) {
          for (var property in obj) {
             if (obj.hasOwnProperty(property)) {
                data = serializeArray(obj[property], data, name ? (name + '.' + property) : property);
             }
          }
       } else {
          data.push({ name: name, value: obj });
       }
       return data;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多