MVC 5 - MultiSelectList,与模型绑定值“的SelectList”属性(MV

2019-10-20 15:29发布

在我的MVC项目,我有我的模型属性结合MultiSelectLists问题。 虽然我可以打通的FormCollection对象中的值,但这些都只是所选的ID。

以下是我的模型类,它代表了一个帖子。

public class PostModel
{
    [Required(ErrorMessage = "Id is a required field")]
    public int Id { get; set; }

    [Required(ErrorMessage = "Post Title is required")]
    [StringLength(500)]
    public string Title { get; set; }

    .......

    public SelectList UnassignedTags { get; set; }
    public SelectList AssignedTags { get; set; }
}

请注意,这只是一个模型类,并具有两个附加属性(UnassignedTags和AssignedTags)仅在屏幕上显示它们的目的和保持通话之间绑定的值。

单篇文章可以打上多个标签。 在我看来,我要两个多选择列表。 一位持有未分配标签(Text和Value)等保持被指定标签(Text和Value)。

在我看来,我表现出了使用下面的代码这些名单多选名单。

@Html.ListBox("UnassignedTagss", Model.UnassignedTags, new { @class = "form-control" })

@Html.ListBox("AssignedTagss", Model.AssignedTags, new { @class = "form-control" })

一切都OK了,当我加载屏幕上的记录。

加载后,我让表之间的用户移动的物品通过JavaScript。

当窗体被调回的版本问题来了。 我无法用我的模型属性绑定列表框的值。

以下是我的显示/编辑帖子记录操作方法。

public ActionResult PostDtls(int postId)
{
    …..
}

[HttpPost]
public ActionResult PostDtls(PostModel post, FormCollection collection)
{
    …….
}

有没有什么办法可以绑定ListBox的项目(无论选择与否)我的型号的SelectList性质即UnAssignedTags和AssignedTags?

目前,我通过JQuery的发布形式返回给服务器之前选择列表框中的所有项目。 这样一来,我得到逗号的FormCollection对象分开的ID。 然而,问题是,如果我不得不认为重新显示,因为无效的ModelState的用户,我必须从基础上的ID中的FormCollection对象可用的数据库中读取标签。 我知道,上述方案是坏的。 我需要知道实现这个要求的一个好方法。

Answer 1:

我不知道你为什么要采取这种方法。 你需要的第一件事情是在你的视图模型2个附加属性(我假设的价值类型为int

public int[] SelectedUnassignedTags { get; set; }
public int[] SelectedAssignedTags  { get; set; }

然后创建DropDownLists如下

@Html.ListBoxFor(m => m.SelectedUnassignedTags, Model.UnassignedTags, ...)
@Html.ListBoxFor(m => m.SelectedUnassignedTags, Model.UnassignedTags, ...)

在回传, SelectedUnassignedTagsSelectedAssignedTags将包含已在各自的列表框被选中的值,因此,例如,如果你选择了这两个选项

<option value="2">Item No 2</option>
<option value="4">Item No 4</option>

然后SelectedUnassignedTags将是含有2和4的阵列

在您发布方法(没有看到任何需要FormCollection

public ActionResult PostDtls(PostModel post)
{
  if (!ModelState.IsValid())
  {
    // Repopulate you select lists (as you would have done in the get method)
    return View(post);
  }
}

要尝试并构建在JavaScript中所有必要的选项值,相关的文本和选择状态和后回来这么多额外的数据,然后重建他们在POST方法可能比数据库调用更昂贵的(当然,你可以始终缓存它们避免调用数据库)



文章来源: MVC 5 - MultiSelectList, Binding values with Model “SelectList” property