C# ASP MVC淘汰json嵌套的foreach数据绑定
对不起,如果已经有人问过这个问题,我已经问过无数类似的问题,但似乎没有一个与我的问题有关 我对MVCWebAPI和JavaScript/knockout还相当陌生 查看模型脚本-QuestionItems.jsC# ASP MVC淘汰json嵌套的foreach数据绑定,c#,json,knockout.js,asp.net-web-api,data-binding,C#,Json,Knockout.js,Asp.net Web Api,Data Binding,对不起,如果已经有人问过这个问题,我已经问过无数类似的问题,但似乎没有一个与我的问题有关 我对MVCWebAPI和JavaScript/knockout还相当陌生 查看模型脚本-QuestionItems.js var SectionModel = function (data) { var self = this; self.SectionName = ko.observable(data.SectionName); self.SectionNumber = ko.o
var SectionModel = function (data) {
var self = this;
self.SectionName = ko.observable(data.SectionName);
self.SectionNumber = ko.observable(data.SectionNumber);
self.Questions = ko.observableArray();
};
var questionnaireViewModel = function () {
self.sections = ko.observableArray();
self.error = ko.observable();
var itemsUri = '/api/QuestionnaireItems/';
var sectionsUri = '/api/QuestionnaireSections/';
function ajaxHelper(uri, method, data) {
self.error('');
return $.ajax({
type: method,
url: uri,
dataType: 'json',
contentType: 'application/json',
data: data ? JSON.stringify(data) : null
}).fail(function (jqXHR, textStatus, errorThrown) {
self.error(errorThrown);
});
}
function getAllQuestions() {
ajaxHelper(itemsUri, 'GET').done(function (data) {
for (var s = 0; s < self.sections.length; s++) {
// find all the questions for this section
var sectionQuestions = data.filter(function (item) {
return item.SectionName == self.sections[s].SectionName;
});
// add the questions to each section
self.sections.Questions(sectionQuestions);
}
});
}
function getAllSections() {
ajaxHelper(sectionsUri, 'GET').done(function (data) {
// map each data item to a SectionModel and store that in your main viewModel
var sectionsTemp = data.map(function (item) {
return new SectionModel(item);
});
self.sections(sectionsTemp);
});
}
getAllSections();
getAllQuestions();
};
ko.applyBindings(questionnaireViewModel);
SectionItemList.cs(DTO)
问题REITEMSController:
public class QuestionnaireItemsController : ApiController
{
private SQAContext db = new SQAContext();
// GET: api/QuestionnaireItems
[HttpGet]
public IQueryable<QuestionItemList> GetItems()
{
var items = from a in db.QuestionnaireItems
select new QuestionItemList()
{
Id = a.PID,
SectionNumber = a.QuestionnaireSection.Number,
SectionName = a.QuestionnaireSection.Name,
QuestionNumber = a.Number,
QuestionName = a.Name
};
return items;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool QuestionnaireItemExists(int id)
{
return db.QuestionnaireItems.Count(e => e.PID == id) > 0;
}
}
public class QuestionnaireSectionsController : ApiController
{
private SQAContext db = new SQAContext();
// GET: api/QuestionnaireSections
[HttpGet]
public IQueryable<SectionItemList> GetSectionItems()
{
var items = from a in db.QuestionnaireSections
select new SectionItemList()
{
Id = a.PID,
SectionNumber = a.Number,
SectionName = a.Name
};
return items;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool QuestionnaireSectionExists(int id)
{
return db.QuestionnaireSections.Count(e => e.PID == id) > 0;
}
}
公共类问题的提问者:ApiController
{
私有SQAContext db=新的SQAContext();
//获取:api/QuestionnaireItems
[HttpGet]
公共IQueryable GetItems()
{
var items=来自db.QuestionnaireItems中的a
选择新问题项列表()
{
Id=a.PID,
SectionNumber=a.question.Number,
SectionName=a.QuestionName.Name,
问题编号=a.编号,
问题名称=a.名称
};
退货项目;
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
私人布尔问题(int id)
{
返回db.QuestionnaireItems.Count(e=>e.PID==id)>0;
}
}
问题切除控制器:
public class QuestionnaireItemsController : ApiController
{
private SQAContext db = new SQAContext();
// GET: api/QuestionnaireItems
[HttpGet]
public IQueryable<QuestionItemList> GetItems()
{
var items = from a in db.QuestionnaireItems
select new QuestionItemList()
{
Id = a.PID,
SectionNumber = a.QuestionnaireSection.Number,
SectionName = a.QuestionnaireSection.Name,
QuestionNumber = a.Number,
QuestionName = a.Name
};
return items;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool QuestionnaireItemExists(int id)
{
return db.QuestionnaireItems.Count(e => e.PID == id) > 0;
}
}
public class QuestionnaireSectionsController : ApiController
{
private SQAContext db = new SQAContext();
// GET: api/QuestionnaireSections
[HttpGet]
public IQueryable<SectionItemList> GetSectionItems()
{
var items = from a in db.QuestionnaireSections
select new SectionItemList()
{
Id = a.PID,
SectionNumber = a.Number,
SectionName = a.Name
};
return items;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool QuestionnaireSectionExists(int id)
{
return db.QuestionnaireSections.Count(e => e.PID == id) > 0;
}
}
公共类问题删除控制器:ApiController
{
私有SQAContext db=新的SQAContext();
//获取:api/问题删除
[HttpGet]
公共IQueryable GetSectionItems()
{
var items=来自数据库中的a.questionnairections
选择新的SectionItemList()
{
Id=a.PID,
截面编号=a.编号,
SectionName=a.名称
};
退货项目;
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
private bool QuestionNairectionExists(内部id)
{
返回db.questionnairections.Count(e=>e.PID==id)>0;
}
}
由于您似乎对使用传统的,因此您应该在其下使用基于索引的分配,如self.sections[s]。问题(sectionQuestions)代码>。这应该可以解决问题。那么你能在这里简要介绍一下什么问题吗?部分列表正在显示,但每个部分下的问题都没有。是的,它不会@karyn。这段代码是错误的,因为没有[s]
self.sections.Questions(sectionQuestions)代码>。尝试在我的顶层评论中做这样的操作,让我们知道你可能想考虑添加一个新的Web API端点(你可以离开其他的,因为它们对于其他用例可能是可行的),将该部分和问题加载为一组数据,而不是两个异步调用,并在客户端上进行组合工作。服务器端代码可能更容易使用,因为您是JavaScript新手。这也将把JavaScript代码简化为一个AJAX调用。我还建议在客户端创建一个可以从数据映射的问题模型。问题发送到SectionModel。由于您似乎对
使用传统的,因此您应该在其下使用基于索引的分配,如self.sections[s]。问题(sectionQuestions)代码>。这应该可以解决问题。那么你能在这里简要介绍一下什么问题吗?部分列表正在显示,但每个部分下的问题都没有。是的,它不会@karyn。这段代码是错误的,因为没有[s]
self.sections.Questions(sectionQuestions)代码>。尝试在我的顶层评论中做这样的操作,让我们知道你可能想考虑添加一个新的Web API端点(你可以离开其他的,因为它们对于其他用例可能是可行的),将该部分和问题加载为一组数据,而不是两个异步调用,并在客户端上进行组合工作。服务器端代码可能更容易使用,因为您是JavaScript新手。这也将把JavaScript代码简化为一个AJAX调用。我还建议在客户端创建一个QuestionModel,可以从data.Questions发送到SectionModel。
public class QuestionnaireSectionsController : ApiController
{
private SQAContext db = new SQAContext();
// GET: api/QuestionnaireSections
[HttpGet]
public IQueryable<SectionItemList> GetSectionItems()
{
var items = from a in db.QuestionnaireSections
select new SectionItemList()
{
Id = a.PID,
SectionNumber = a.Number,
SectionName = a.Name
};
return items;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool QuestionnaireSectionExists(int id)
{
return db.QuestionnaireSections.Count(e => e.PID == id) > 0;
}
}