C# <;选择>;标记辅助对象,不将选项标记为";精选;多选

C# <;选择>;标记辅助对象,不将选项标记为";精选;多选,c#,asp.net-core,razor,html-select,tag-helpers,C#,Asp.net Core,Razor,Html Select,Tag Helpers,以以下模型为例: 公共类模型 { 公共ICollection标记{get;set;} } 公共类标签 { 公共int Id{get;set;} 公共字符串值{get;set;} } 该模型是某种对象(例如博客条目),其特征是标签或关键字列表 我有一个Razor视图,显示一个表单,用于编辑SomeModel对象: @model SomeModel @{ //控制器传递可用标记的列表 变量标记=(列表)视图数据[“标记”]; } 标签 正如预期的那样,这将生成一个显示可用标记的多选: 标签 ta

以以下模型为例:

公共类模型
{
公共ICollection标记{get;set;}
}
公共类标签
{
公共int Id{get;set;}
公共字符串值{get;set;}
}
该模型是某种对象(例如博客条目),其特征是标签或关键字列表

我有一个Razor视图,显示一个表单,用于编辑
SomeModel
对象:

@model SomeModel
@{
//控制器传递可用标记的列表
变量标记=(列表)视图数据[“标记”];
}
标签
正如预期的那样,这将生成一个显示可用标记的多选:

标签
tag1
tag2
@Model.Tags
正确包含当前分配的标记;但是,相应的选项未标记为选中的


如何修复此行为?

您需要创建一个属性来传递所选数据,并将其绑定到select标记的
asp for
属性

Index.cshtml.cs:

public class IndexModel : PageModel
{
    [BindProperty]
    public List<int> SelectedTags { get; set; } =  new List<int>{  2, 3 };
    [BindProperty]
    public List<Tag> Tags { get; set; }
    public void OnGet()
    {
        Tags = new List<Tag> {
    new Tag { Id = 1, Value="Mike" },
    new Tag { Id = 2, Value="Pete" },
    new Tag { Id = 3, Value="Katy" },
    new Tag { Id = 4, Value="Carl" } };

    }
}
公共类索引模型:PageModel
{
[BindProperty]
public List SelectedTags{get;set;}=新列表{2,3};
[BindProperty]
公共列表标记{get;set;}
公共互联网
{
标签=新列表{
新标记{Id=1,Value=“Mike”},
新标记{Id=2,Value=“Pete”},
新标记{Id=3,Value=“Katy”},
新标签{Id=4,Value=“Carl”};
}
}
Index.cshtml:

@page
@模型WebApplication1\u rzaor\u page.IndexModel
@{
ViewData[“Title”]=“SelectTag”;
Layout=“~/Pages/Shared/_Layout.cshtml”;
}
选择标签
标签

你的意思是我必须创建一个单独的标记ID列表,而不是直接传递
列表
?我想知道为什么ASP.NET本身不这样做,因为我还是指定了相应的成员(
Id
)。SelectListItem是绑定select标记的默认类型。绑定不同类型时,需要指定字段与SelectListItem的文本和值字段相对应。您可以查看以下链接: