【问题标题】:MVC: Binding dynamic select list back to ViewModel on PostMVC:在 Post 上将动态选择列表绑定回 ViewModel
【发布时间】:2011-05-25 02:24:51
【问题描述】:

我有一个 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>
}

控制器片段:

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

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

我在普通网络表单方面非常有经验,但仍在学习 MVC,因此非常感谢任何帮助。

[更新]

明天我会进一步更新问题,但如果我选择列表中的项目,它们似乎将绑定到视图模型。我明天会解决这个问题的。但是非常感谢到目前为止所有的 cmets、帮助和建议。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 这对于 MVC 3 没有改变吗?更简单,更好的支持?
  • 另见我在下面对亚历山大的评论。我以编程方式加载数据然后在发布期间将其取回没有问题,似乎当我使用 jQuery 将新值“插入”到 HTML 选择列表时,我无法获取这些值。这有意义吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • 是的,即使对我来说也有效,但我的问题不是当我以编程方式创建列表并添加它时,问题似乎是加载时列表为空,然后我动态添加条目to 正在使用 jQuery。所以当我提交表单时,我找不到值。
  • 您能否完善您的问题并展示您如何使用 jQuery 将条目添加到列表中?
  • 好的,可以,但我想我遇到了这个问题,我会更新我的问题。问题似乎是当我添加一个新的 SelectList 项目时,如果它们被选中,它只会将其添加到 post 绑定中。我明天会更新它,但非常感谢到目前为止的帮助。
【解决方案3】:

好的,我找到了问题所在。当您的 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

我真的希望这对某人有所帮助。

【讨论】:

  • 我也遇到了同样的问题,这是我目前找到的最好的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多