【问题标题】:How do I get the data from a Select2 options/value (tags) to the controller in asp.net mvc?如何从 Select2 选项/值(标签)获取数据到 asp.net mvc 中的控制器?
【发布时间】: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>

现在我只是不知道如何将数据从我的编辑器模板/视图获取到控制器。返回时列表为空。

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

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

【问题讨论】:

  • 您不能将 &lt;select&gt; 绑定到复杂对象的集合 - 您需要一个属性(例如)int[] SelectedTags 来绑定(假设您想回发 Id 的选择Tags)。并用@Html.ListBoxFor(m =&gt; m.SelectedTags, new SelectList(Model.Tags, "Id", "Name") 替换你的EditorTemplate 然后$('#SelectedTags').select2() {...
  • 感谢您的回答。好的,所以我将它改回视图模型中的字符串列表,并使用@Html.ListBoxFor。但是,我不完全理解“然后是 $('#SelectedTags').‌​select2() {...”的意思。
  • A &lt;select multiple&gt; 回传一组简单值(stringint 等),而不是一组复杂对象。我不知道您是否要绑定到ArticleTagIdName 值,但您的视图模型需要一组匹配的简单值(string[]int[])才能绑定。我建议将其命名为SelectedTags,因此您的控件的idSelectedTags,这就是它需要为$('#SelectedTags').‌​select2() {... 的原因。为什么要使用data: .... 手动覆盖这些值?
  • 应该是数组,还是可以是List? “数据:”是自动完成数据,我还没有到那部分。
  • List&lt;string&gt;string[]

标签: c# asp.net-mvc jquery-select2 mvc-editor-templates


【解决方案1】:

&lt;select multiple&gt; 回发一个简单值数组,而不是复杂对象,因此您不能绑定到属性IList&lt;ArticleTag&gt; Tags。您的视图模型应包含要绑定的属性和选项的属性(以下假设您要回发每个选定的 ArticleTagName 属性)。

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

【讨论】:

  • 嗨,斯蒂芬,你知道我如何实现这个,其中标签来自具有 2 个字符串属性的对象列表吗? 1 表示显示名称,1 表示值?
  • @Bassie,我不确定我是否理解 - 您是否要显示(例如)您的对象的 Name 属性但回发所选对象的关联 Id
  • 我实际上找到了解决方案。我要找的是:@Html.ListBoxFor(m =&gt; m.SelectedTags, new SelectList(users, "UserName", "DisplayName")) 所以标签使用DisplayName 属性来显示用户,但是提交的字符串值来自UserName 属性
  • @Bassie - 作为旁注,最佳实践是 users 属性应该是 IEnumerable&lt;SelectListItem&gt;,而不是 IEnumerable&lt;yourObject&gt;) 所以它只是 @Html.ListBoxFor(m =&gt; m.SelectedTags, users) 在视图中
猜你喜欢
  • 2021-05-09
  • 2021-08-14
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多