我有一个模型,其字段类型需要发布到后端控制器操作。我想知道如何在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; }
}
答案 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)