Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP MVC淘汰json嵌套的foreach数据绑定_C#_Json_Knockout.js_Asp.net Web Api_Data Binding - Fatal编程技术网

C# ASP MVC淘汰json嵌套的foreach数据绑定

C# 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

对不起,如果已经有人问过这个问题,我已经问过无数类似的问题,但似乎没有一个与我的问题有关

我对MVCWebAPI和JavaScript/knockout还相当陌生

查看模型脚本-QuestionItems.js

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;
    }
}