C# 使用jQuery将数组从视图发布到控制器

C# 使用jQuery将数组从视图发布到控制器,c#,jquery,asp.net-mvc-4,C#,Jquery,Asp.net Mvc 4,} 我有下面的代码用于发布到控制器 function myItemsViewModel(ItemID, GroupID, ItemName, Quantity) { this.ItemID = ItemID; this.GroupID = GroupID; this.ItemName = ItemName; this.Quantity = Quantity; 在var viewmodel=JSON.stringify(obj)行,viewmodel在我的ItemsList数组变量中具有所需的所

}

我有下面的代码用于发布到控制器

function myItemsViewModel(ItemID, GroupID, ItemName, Quantity) {
this.ItemID = ItemID;
this.GroupID = GroupID;
this.ItemName = ItemName;
this.Quantity = Quantity;
var viewmodel=JSON.stringify(obj)行,viewmodel在我的
ItemsList
数组变量中具有所需的所有值

问题是我的ItemsList数组在控制器中显示为null。Name和Department使用正确的传递值进行传递

下面是我的控制器代码

课程

 var CreateRecord = function () {
    var Name = $.trim($("#divCreate").find("#txtName").val());
    var Department  = $.trim($("#divCreate").find("#txtDepartment").val());

    var ItemsList = [];
    $('#myDynamicTable').find('tr').each(function () {
        var row = $(this);
        var itemName = $.trim(row.find(".itemName input").val());
        var itemQty = $.trim(row.find(".itemQty input").val());

        var myItems = new myItemsViewModel("", "", itemName, itemQty);
        ItemsList.push(myItems);
    });

    var obj = new myRecordEntryViewModel("", Name, Department, ItemsList);
    var viewmodel = JSON.stringify(obj);    
                $.ajax({
                    type: 'POST',
                    cache: false,
                    dataType: 'html',
                    data: viewmodel,
                    headers: GetRequestVerificationToken(),
                    contentType: 'application/json; charset=utf-8',
                    url: '/' + virtualDirectory + '/RecordEntry/Save',
                    success: function (data) {
                        $("#divMaster").html(data);
                        return false;
                    },
                    error: function (msg) {
                        alert("Error Submitting Record Request!");
                    }
                });
            }
 public class myRecordEntryViewModel 
{
    public  long ID { get; set; }
    public  string Name { get; set; }
    public string Department { get; set; }
    //public string[] ItemsList { get; set; }
    public List<Item> ItemsList {get ; set;}
}
保存操作

 public class myRecordEntryViewModel 
    {
        public  long ID { get; set; }
        public  string Name { get; set; }
        public string Department { get; set; }
        public string[] ItemsList { get; set; }
    }

我想知道为什么
viewModel.ItemsList
在controller中是空的,但在从jQuery发布期间它有值。

您的代码中有几个问题

1) 类中的ItemList和javascript代码不一样——第一个是字符串数组,第二个是对象数组

2) 在操作方法中,应按如下方式更改参数类型:

    [ActionName("Save")]
    [NoCache]
    public ActionResult Save(myRecordEntryViewModel viewModel)
    {
            //here viewModel.ItemsList is null, what could i be missing
            if (this.SaveEntry(viewModel.Name,viewModel.Department,viewModel.ItemsList))
            {

            }
        return this.View();
    }
3) 在action方法的主体中,应该反序列化json字符串(viewModel),并从中生成模型对象。下面是一个例子


您应该为项目列表中的项目创建一个类(在C#中)

然后更改viewmodel类

public class Item {
    public string ItemName { get; set; }
    public int Quantity { get; set; }
}
公共类myRecordEntryViewModel
{
公共长ID{get;set;}
公共字符串名称{get;set;}
公共字符串部门{get;set;}
//公共字符串[]项列表{get;set;}
公共列表项列表{get;set;}
}

控制器无法将项目列表从您的请求映射到模型中,因为一个是字符串列表,另一个是对象列表。

请尝试下面的代码,看看您的模型是否获得了值。 如果您遇到任何问题,请告诉我,因为我已经在我的一个项目中实现了这一点

 var CreateRecord = function () {
    var Name = $.trim($("#divCreate").find("#txtName").val());
    var Department  = $.trim($("#divCreate").find("#txtDepartment").val());

    var ItemsList = [];
    $('#myDynamicTable').find('tr').each(function () {
        var row = $(this);
        var itemName = $.trim(row.find(".itemName input").val());
        var itemQty = $.trim(row.find(".itemQty input").val());

        var myItems = new myItemsViewModel("", "", itemName, itemQty);
        ItemsList.push(myItems);
    });

    var obj = new myRecordEntryViewModel("", Name, Department, ItemsList);
    var viewmodel = JSON.stringify(obj);    
                $.ajax({
                    type: 'POST',
                    cache: false,
                    dataType: 'html',
                    data: viewmodel,
                    headers: GetRequestVerificationToken(),
                    contentType: 'application/json; charset=utf-8',
                    url: '/' + virtualDirectory + '/RecordEntry/Save',
                    success: function (data) {
                        $("#divMaster").html(data);
                        return false;
                    },
                    error: function (msg) {
                        alert("Error Submitting Record Request!");
                    }
                });
            }
 public class myRecordEntryViewModel 
{
    public  long ID { get; set; }
    public  string Name { get; set; }
    public string Department { get; set; }
    //public string[] ItemsList { get; set; }
    public List<Item> ItemsList {get ; set;}
}

您的模型中的
ItemsList
string[]
,但是您的脚本似乎正在生成一个包含多个属性的javascript对象数组(什么是
myItemsViewModel
?)您可以显示视图模型的JSON字符串吗?@StephenMuecke,我已经编辑了我的帖子,添加了“myItemsViewModel”,因此
公共字符串[]项目列表
正确吗?-您不能将复杂对象数组发布到
string[]
@SQL.NETWarrior。如果将
ItemsList
更改为
var ItemsList=['abc','def']
并将
traditional:true,
添加到ajax选项中,您将看到您的模型已正确绑定。否则,您需要将
ItemsList
更改为
IEnumerable
,其中
ItemsModel
包含
myItemsViewModel
数据类型中的4个属性:指定从方法返回的数据,方法返回一个视图(即html)。OP有一个模型,所以你到底为什么要绑定到一个字符串。
DefaultModelBinder
为您处理所有这些。@StephenMuecke哦,是的,您是对的。这是我关于数据类型和内容类型的错误。非常感谢。