JQuery将一个带有Dictionary的复杂对象传递给MVC控制器动作

时间:2017-10-04 19:49:56

标签: jquery asp.net-mvc dictionary

我有一个模型,其字段类型需要发布到后端控制器操作。我想知道如何在JQuery中定义模型对象?

我通过以下代码继续从ajax调用中获得原始错误:

.getActiveSheet()

在我的后端操作方法中:

.getSheetByName('Sheet1')

有人能指出我做错了吗?

谢谢。

更新 这是视图模型

var templateBuilder = {
  TemplateTitle: "Title",
  ParagraphTitle: "",
  ParagraphTitleList: "",
  ParagraphText: "",
  ParagraphId: "",
  ParagraphOrder: "",
  ParagraphDictionary: ""
};

templateBuilder.ParagraphDictionary = dict; //dict is a Dictionary<int, int> type variable I populated earlier.

$.ajax({
  url: "/TemplateBuilder/Build",
  type: "POST",
  data: templateBuilder,
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function(response) {
    alert("successful");
  },
  error: function(response) {
    alert("fail");
    alert(response.responseText);
  }
});

在哪里填充dict:     var dict = [];

public ActionResult Build([FromUri]TemplateBuilderViewModel templateBuilder)

更新的JQuery部分: 在我对下面进行了更改后,问题是我可以看到控制器操作,但是从操作方法参数templateBuilder,属性ParagraphDictionary的计数是0,这意味着不解析Dictionary并传递给后端。其他属性如TemplateTitle在那里有价值。 有什么想法吗?

public class TemplateBuilderViewModel
{

    //public int Id { get; set; }

    [DisplayName("Template Title")]
    public string TemplateTitle { get; set; }

    [DisplayName("Paragraph List")]
    public string ParagraphTitle { get; set; }
    public SelectList ParagraphTitleList { get; set; }

    [DisplayName("Paragraph Body")]
    [DataType(DataType.MultilineText)]
    public string ParagraphText { get; set; }

    public int ParagraphId { get; set; }

    public int ParagraphOrder { get; set; }

    public Dictionary<int, int> ParagraphDictionary { get; set; }
}

3 个答案:

答案 0 :(得分:0)

好的,首先你没有显示出“原始错误”是什么,所以我会在类似情况下提出一些对我有用的提示

HttpPost 装饰器设置为您的方法并删除 FromUri

[HttpPost]
public ActionResult Build(TemplateBuilderViewModel templateBuilder)

其次,如果您的模型出现问题并且导致错误,您可以尝试使用通用模型并在方法中进行解析,这样您的模型将始终被接受

[HttpPost]
public ActionResult Build(object templateBuilder)
{
TemplateBuilderViewModel tb = JsonConvert.DeserializeObject<TemplateBuilderViewModel>(((Newtonsoft.Json.Linq.JObject)templateBuilder)["templateBuilder"].ToString());
}

最后,也许您的问题是授权,因此将 AllowAnonymous 装饰器添加到您的方法中以进行测试

答案 1 :(得分:0)

在您的javascript中,您的dict对象是一个无法映射到字典中的对象数组。而是使用dict{}定义为对象,然后使用javascript括号表示法对属性进行寻址。不可否认,对象和数组之间的界限在js中变得有点模糊。试试这个:

dict = {};
for (i = 1; i < counter; i++) 
{
    var paragraphId = Id;
    var order = order;

    dict[paragraphId] = order;
}

我不是肯定你想按顺序进行整理。在我的简单模拟中,我使用了以下视图模型的Dictionary<int, int>映射得很好。只需根据需要替换索引和值。

var model = {
    Name: 'your face',
    Value: 8,
    Dictionary: {}                
};
for (var i = 0; i < 5; i++)
    model.Dictionary[i] = i;

为了测试目的,我在视图模型上添加了额外的属性,完全没有意义。

答案 2 :(得分:0)

这是我的工作解决方案。 在ViewModel类中,我有:

public class TemplateBuilderViewModel
{

    [DisplayName("Template Title")]
    public string TemplateTitle { get; set; }

    [DisplayName("Paragraph List")]
    public string ParagraphTitle { get; set; }

    public SelectList ParagraphTitleList { get; set; }

    [DisplayName("Paragraph Body")]
    [DataType(DataType.MultilineText)]
    public string ParagraphText { get; set; }

    public List<ParagraphOrderModel> ParagraphOrder { get; set; }
}



public class ParagraphOrderModel
{
    public int ParagraphId { get; set; }
    public int ParagraphOrder{ get; set; }
}

在视图中,我在JQuery中有这个:

var dict = [];

for (i = 1; i < counter; i++) {
    var paragraphId = Id;

    var order = order;

    dict.push({
        "ParagraphId": paragraphId,
        "ParagraphOrder": order
    });
}

var templateBuilder = {
    TemplateTitle: templateTitle,
    ParagraphTitle: "",
    ParagraphTitleList: undefined,
    ParagraphText: "",
    ParagraphOrder: dict
};

$.ajax(
    {
        url: "/TemplateBuilder/Build",
        type: "POST",
        data: JSON.stringify({ templateBuilder: templateBuilder }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            alert("successful");
        },
        error: function (response) {
            alert("fail");
            alert(response.responseText);
        }
    });

在Controller动作方法中,我有:

[HttpPost]
public JsonResult Build(TemplateBuilderViewModel templateBuilder)