C# 如何将更新的列表传递给控制器? 我正在开发我的项目中的一个技能特征,我在想下一步该怎么做,我将首先描述这个系统是如何构建的:

C# 如何将更新的列表传递给控制器? 我正在开发我的项目中的一个技能特征,我在想下一步该怎么做,我将首先描述这个系统是如何构建的:,c#,html,web,asp.net-core,C#,Html,Web,Asp.net Core,有一个selectsize文本窗口,允许您一起选择多个技能,选择链接后,它会将其插入选择窗口下方,并询问您所选技能的级别 它可以被添加和删除,但这让我有点复杂,因为我无法找到一种方法来将所有选定的技能和级别转移到控制器 我只想知道控制器中只有选定的技能及其级别,这是我迄今为止构建的代码: 列表类型: public class SkillDetails { public uint SkillID { get; set; }

有一个selectsize文本窗口,允许您一起选择多个技能,选择链接后,它会将其插入选择窗口下方,并询问您所选技能的级别

它可以被添加和删除,但这让我有点复杂,因为我无法找到一种方法来将所有选定的技能和级别转移到控制器

我只想知道控制器中只有选定的技能及其级别,这是我迄今为止构建的代码:

列表类型:

        public class SkillDetails
        {
            public uint SkillID { get; set; }
            public Levels Level { get; set; }
            public SkillDetails(uint id, Levels level) =>
                (SkillID, Level) = (id, level);
        }
列表定义:

      public IList<Skill.SkillDetails> Skills { get; set; }
HTML用户交互技能:

<div class="input-group mb-2">
    <span class="input-group-prepend">
    <span class="input-group-text">' + e.params.data.text + '</span ></span > 
    <input type="hidden" name="Skills[0].SkillID" value="' + e.params.data.id + '"/>
    <select class="form-control" name="Skills[0].Level">
        <option value="0">None</option>
        <option value="1">Know</option>
        <option value="2">Understand</option>
        <option value="3">Master</option>
    </select>
</div>

因为它是动态的,并且每次创建/删除新技能时,如何根据我选择并输入的技能级别将更新的SkillDetails类型列表传输到控制器?

您的Javascript代码应该包括一种通知控制器技能列表已更改的方法。 您可以使用一个简单的Ajax调用和一个控制器方法端点来实现这一点,该端点将更新后端存储库和数据库

您可以尝试以下方法:


$eventSelect.on("select2:select", function (e)
{
            console.log("select: ", e);
            var fieldWrapper = $("<div class=\"fieldwrapper\" id=\"field" + e.params.data.id + "\"/>");
            var fType = $('<div class="input-group mb-2"><span class="input-group-prepend"><span class="input-group-text">' + e.params.data.text + '</span ></span ><input type="hidden" name="Skills[0].SkillID" value="' + e.params.data.id + '"/><select class="form-control" name="TEST"><option value="0">None</option><option value="1">Know</option><option value="2">Understand</option><option value="3">Master</option></select></div>');
            fieldWrapper.append(fType);
            $("#buildyourform").append(fieldWrapper);


            // This block of code will convert the content of the skill list to json 
            // and pass it back to a controller.
            var jsonSkills = JSON.stringify([js object containing the list of skills]);

            $.ajax({
                type: 'POST',
                url: '/path/to/your/controller',
                data: { 
                   'skillList': jsonSkills 
                },
                success: function(msg){
                    alert('ok: ' + msg);
                }
           });
});
此外,关于您的:

技能[0]。SkillID只是一个测试,它不起作用,它会使系统崩溃 网站


这是因为您没有初始化控制器中的集合,因此遇到空引用异常。

如果您为技能中的每个技能实例提供索引值,则可以向控制器提交项目集合。我在一个项目中也有类似的东西,尽管没有使用JS/Ajax

加:

对于技能的每个实例…其中0更改为每个实例的唯一值

每个“技能”的每个表单字段都应该使用此索引,因此

<input type="text" name="Skills[0].title" id="Skills[0].title" value="[whatever]" />
<input type="text" name="Skills[0].SkillID" id="Skills[0].SkillID" value="[whatever]" />
等等


然后,在控制器中,您可以接受表单提交中的IList技能

你能给你看html吗?什么html代码与什么相关@JamesSHow用户是如何与这个列表交互的?我用这个更新了我的问题,它在javascript代码中@Jamess非常感谢您的回答,但技能只是将员工添加到系统的几个步骤中的一步,在我看来,您的代码发送者个人似乎具备了我在发布时所需的技能@kevinjCan您不可以使用一个单独的控制器端点来更新技能列表,它只会更改数据存储库中的特定数据吗?有一个新的控制器方法,其签名如下:updateskilliststring jsonSkills,string userId@DanThis是一个可以编辑员工详细信息的选项,但我在主题中谈到的是添加员工。这意味着该员工尚不存在,需要添加一些步骤,其中一个步骤使我无法更新@kevinjIn在这种情况下,您可以使用我在Submit按钮中建议的相同逻辑,该按钮用于保存和创建新员工。

$eventSelect.on("select2:select", function (e)
{
            console.log("select: ", e);
            var fieldWrapper = $("<div class=\"fieldwrapper\" id=\"field" + e.params.data.id + "\"/>");
            var fType = $('<div class="input-group mb-2"><span class="input-group-prepend"><span class="input-group-text">' + e.params.data.text + '</span ></span ><input type="hidden" name="Skills[0].SkillID" value="' + e.params.data.id + '"/><select class="form-control" name="TEST"><option value="0">None</option><option value="1">Know</option><option value="2">Understand</option><option value="3">Master</option></select></div>');
            fieldWrapper.append(fType);
            $("#buildyourform").append(fieldWrapper);


            // This block of code will convert the content of the skill list to json 
            // and pass it back to a controller.
            var jsonSkills = JSON.stringify([js object containing the list of skills]);

            $.ajax({
                type: 'POST',
                url: '/path/to/your/controller',
                data: { 
                   'skillList': jsonSkills 
                },
                success: function(msg){
                    alert('ok: ' + msg);
                }
           });
});
<input type="text" name="Skills[0].title" id="Skills[0].title" value="[whatever]" />
<input type="text" name="Skills[0].SkillID" id="Skills[0].SkillID" value="[whatever]" />