MVC:将动态选择列表绑定回Post上的ViewModel

时间:2011-05-25 02:24:52

标签: asp.net-mvc model-view-controller asp.net-mvc-3

我有一个MVC 3项目,并坚持将视图绑定回Post上的模型。

这是我的模特:

public class DBViewModel
{
   public ProductionDatabasesViewModel PDBViewModel { get; set; }
   public IList<string> SelectedNames { get; set; }

   public DBViewModel()
   {
     SelectedNames = new List<string>();
     PDBViewModel = new ProductionDatabasesViewModel();
   }
}

我的观点:(缩减版)

@model Web.Models.DBViewModel
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
       @Html.ListBoxFor(x => x.SelectedNames, new SelectList(Model.SelectedNames))
       <input id="button-submit" name="SubmitButton" type="submit" value="Submit" />
    </fieldset>
}

Controller的片段:

  [HttpPost]
  public ActionResult Database(DBViewModel model)
  {
    var users = model.SelectedNames; //<---- empty, the count is 0 always.
  }

在视图中,可以从自动填充框中选择用户,然后使用jQuery脚本将选定的名称添加到上面视图中的列表中。这一切都有效,所以我可以搜索用户,然后单击添加按钮将用户添加到列表中。但是单击“提交”按钮时遇到问题。在视图中添加的用户(视图中的选择列表)未绑定到模型。所以发布模型.SelectedNames为空。我也尝试了Request [“SelectedNames”]和Request.Form [“SelectedNames”],它们都是空的。

我在正常的网络表格方面非常有经验,但仍然在学习MVC,所以任何帮助都会非常感激。

[UPDATE]

我将在明天进一步更新问题,但如果我选择它们,则列表中的项目似乎将绑定到viewmodel。我明天会搞清楚这一点。但到目前为止,感谢所有评论,帮助和建议。

3 个答案:

答案 0 :(得分:3)

Does the Model Binder in ASP.NET MVC Beta Support List<T>?是否回答了您的问题?字符串列表是一个更简单的版本。

答案 1 :(得分:1)

不得不说这个截断版本的代码可以正常工作。提交后, SelectedNames 列表已从列表框中成功填写。你可以自己检查一下。虽然我做了一些改变:

  • 删除了对ProductionDatabasesViewModel;
  • 的所有引用
  • 数据库方法的POST版本的返回类型更改为 void ;
  • 添加了数据库方法的GET版本

public ActionResult Database()
{
    return View(new DBViewModel { SelectedNames = { "a", "b", "c" } });
}

所以我相信你在其他地方都有一个错误,而不是在这些部分。

答案 2 :(得分:1)

好的,我找到了问题所在。如果html中有一个多选元素,要将框中的值绑定回模型,则必须先选择项目。非常讨厌,但这似乎是它想要的方式。

因此,如果您有一个选择框,如:

<select id="selected-ad-users-list" name="SelectedNames" multiple="multiple" size="5"
       style="width: 100%">
</select>

你可以从任何地方添加项目,在我的情况下,我有另一个列表/或文本框,他们在其中键入了一个名称,然后我使用jQuery来填充这个选择列表。我需要做的是添加一些jQuery脚本来旋转我的列表并选择所有项目。因此,一旦选择了项目,它就会将它们绑定到模型。

以下是一篇很好的文章:select all or some items in a select box

我真的希望这有助于某人。