下拉列表ASP.NET MVC不更新模型

时间:2012-12-05 12:38:36

标签: c# asp.net-mvc html-select

我有两个这样的Model类:

程序:

public class Program
{
    public int ProgramId { get; set; }

    public string Name { get; set; }

    public virtual Playlist chosenPlaylist { get; set; }

    public virtual IList<Playlist> Playlists { get; set; }
}

public class Playlist
{
    public int PlaylistId { get; set; }

    public string Name { get; set; }

    public int NumberVotes { get; set; }

    public virtual IList<Song> Songs { get; set; }
}

在我的编辑程序视图中,我想更新chosenPlaylist,以便我可以允许用户选择Program的{​​{1}}中的任何一个。

例如:

计划1:

  • 播放列表1
  • 播放列表2

选择播放列表:播放列表1

因此,用户可以编辑并选择无(因此没有播放列表),1(不会更改任何内容)或2并将其保存到数据库中。

我试图在我的控制器中创建一个下拉列表,但它不会更新。

以下是我在GET和POST编辑Playlist中的内容:

ActionResult

在我的观点中:

ViewBag.chosenId = new SelectList(program.Playlists, "PlaylistId",
"Name", program.chosenPlaylist.PlaylistId);

这会显示列表正确并预先选择所选的播放列表(如果有的话)(如果没有,我会为其编写代码以默认为第一个)。如果程序中没有播放列表,则很容易控制。

然而,问题:

  • 不更新我的模型。例如,如果播放列表2是所选择的播放列表,并且我选择P1,它将在POST事件后继续显示P2。
  • 我想在下拉列表中包含一个选项,以便不选择任何值(因此,在该字段中放置一个NULL)。那可能吗?

没有抛出任何错误,除了最重要的部分外,一切似乎都有效 - 更新数据库。

3 个答案:

答案 0 :(得分:3)

确保没有@Html.HiddenFor或类似的呈现相同的项目。

答案 1 :(得分:2)

你可以做两件事:

@Html.DropDownList("PlaylistId", (SelectList)ViewBag.chosenId)更改为@Html.DropDownList("chosenPlaylist.PlaylistId", (SelectList)ViewBag.chosenId)

或使用Html.DropDownListFor(m => m.chosenPlaylist.PlaylistId, (SelectList)ViewBag.chosenId))

答案 2 :(得分:0)

使用时:

@Html.DropDownList("PlaylistId", (SelectList)ViewBag.chosenId)

您必须将PlaylistId选择列表重命名为与存储所选Id的属性名不同的内容,否则不会将其标记为已选中。

(现在有意义的是,我输入它,你不能将所选的值存储到与选择列表相同的内容中)

基本上说:

@Html.DropDownList("MySelectListId", (SelectList)ViewBag.chosenId)

会奏效。

您可以在codeplex查看有关此问题的评论,以获取更多信息:http://aspnet.codeplex.com/workitem/4932