【发布时间】:2016-08-16 23:22:02
【问题描述】:
我正在尝试使用 Select2 来编辑文章的标签。我的问题是,我的视图模型中的 Tags 字段在返回到控制器时为空。
一个 ArticleTag 有一个 Id 和一个 Name 字段。
视图模型
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>
现在我只是不知道如何将数据从我的编辑器模板/视图获取到控制器。返回时列表为空。
我已尝试将其更改为字符串列表(在视图模型、编辑器模板等中)。我试图为名称字段添加一个编辑器模板。结果一样。
对我来说最好的办法实际上是将标签作为逗号分隔的字符串。但我只是不希望它以某种方式工作。
【问题讨论】:
-
您不能将
<select>绑定到复杂对象的集合 - 您需要一个属性(例如)int[] SelectedTags来绑定(假设您想回发Id的选择Tags)。并用@Html.ListBoxFor(m => m.SelectedTags, new SelectList(Model.Tags, "Id", "Name")替换你的EditorTemplate然后$('#SelectedTags').select2() {... -
感谢您的回答。好的,所以我将它改回视图模型中的字符串列表,并使用@Html.ListBoxFor。但是,我不完全理解“然后是 $('#SelectedTags').select2() {...”的意思。
-
A
<select multiple>回传一组简单值(string、int等),而不是一组复杂对象。我不知道您是否要绑定到ArticleTag的Id或Name值,但您的视图模型需要一组匹配的简单值(string[]或int[])才能绑定。我建议将其命名为SelectedTags,因此您的控件的id为SelectedTags,这就是它需要为$('#SelectedTags').select2() {...的原因。为什么要使用data: ....手动覆盖这些值? -
应该是数组,还是可以是List
? “数据:”是自动完成数据,我还没有到那部分。 -
List<string>或string[]
标签: c# asp.net-mvc jquery-select2 mvc-editor-templates