如何从 Select2 options/value(标签)获取数据到 asp.net mvc 中的控制器?

How do I get the data from a Select2 options/value (tags) to the controller in asp.net mvc?

我正在尝试使用 Select2 来编辑文章的标签。我的问题是,当返回到控制器时,我的视图模型中的 Tags 字段为空。

一个 ArticleTag 有一个 Id 和一个 Name 字段。

ViewModel

public class EditArticleViewModel
{
    public Guid Id { get; set; }
    public string Header { get; set; }
    public string Description { get; set; }
    [AllowHtml]
    public string Body { get; set; }
    public string Image { get; set; }
    public bool IsPublished { get; set; }
    [UIHint("TagsEditor")]
    public IList<ArticleTag> Tags { get; set; }
}

编辑文章视图

<div class="form-group">
@Html.LabelFor(model => model.Tags, new { @class = "control-label col-md-2" })
<div class="col-md-10">
    @Html.EditorFor(model => model.Tags)
    @Html.ValidationMessageFor(model => model.Tags, "", new {@class = "text-danger"})       
</div>

<script type="text/javascript">
    $('#tags')
        .select2({
            data: ["Clare", "Cork", "South Dublin"],
            tags: true,
            tokenSeparators: [','],
            placeholder: "Add your tags here"
        });
</script>

编辑器模板

@model List<MVCForum.Domain.DomainModel.CMS.ArticleTag>
<select id="tags" multiple="multiple" style="width: 100%">
@for (int i = 0; i < Model.Count; i++)
{       
    <option selected="selected">@Model[i].Name</option>
}
</select>

现在我只是想不出如何将数据从我的 Editortemplate/View 获取到控制器。返回时列表为空。

我试图将其更改为字符串列表(在视图模型、编辑器模板等中)。我试图为名称字段添加一个编辑器模板。相同的结果。

对我来说最好的办法实际上是将标签作为逗号分隔的字符串获取。但我只是不想让它以某种方式工作。

A <select multiple> posts 返回一个简单值数组,而不是复杂对象,因此您不能绑定到 属性 IList<ArticleTag> Tags。您的视图模型应包含要绑定的 属性 和选项的 属性 (以下假设您想要 post 支持每个选项的 Name 属性已选择 ArticleTag).

public class EditArticleViewModel
{
    public Guid Id { get; set; }
    ....
    [Display(Name = "Tags")]
    public IEnumerable<string> SelectedTags { get; set; }
    public IEnumerable<SelectListItem> TagsList { get; set; }
}

您的 GET 方法将是

var tags = db.ArticleTag.Select(x => x.Name);
var model = new EditArticleViewModel()
{
     TagsList = new SelectList(tags),
     SelectedTags = ... // set values to be selected initially if required
};
return View(model);

然后删除您的 EditorTemplate 并将其替换为强类型 ListBoxFor() 方法,以便它绑定到您的模型属性

@Html.ListBoxFor(m => m.SelectedTags, Model.TagsList)

并修改脚本以使用由 ListBoxFor() 方法生成的 id 属性

$('#SelectedTags').select2({
    tags: true,
    tokenSeparators: [','],
    placeholder: "Add your tags here"
});