MVC 3:编辑表单上的DropDownList,用于作为ViewModel属性的对象

Sea*_*sby 5 c# asp.net-mvc entity-framework-4 razor asp.net-mvc-3

概述: 我正在尝试使用具有属性的ViewModel,该属性是我正在尝试编辑的模型类.在直接编辑模型时,我已经看到编辑表单使用MVC脚手架编辑表单,但是我尝试使用包含正在编辑的模型的ViewModel.除了保存DropDownList中显示的字段外,一切都有效.

说明: 我尝试使用MVC 3的脚手架功能为模型创建编辑表单.在MVC音乐商店教程中,这是在a的编辑页面中完成AlbumStoreManagerController.在该页面中,他们为Genre和Artist提供了两个下拉菜单.在视图中每个看起来都类似于: -

<div class="editor-label">
    @Html.LabelFor(model => model.GenreId, "Genre")
</div>
<div class="editor-field">
    @Html.DropDownList("GenreId", String.Empty)
    @Html.ValidationMessageFor(model => model.GenreId)
</div>
Run Code Online (Sandbox Code Playgroud)

据我所知,这些可以使用ViewBag在控制器中填写选项.

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
Run Code Online (Sandbox Code Playgroud)

直接使用模型

在我的代码中,我设法对通过实体框架保存到数据库的对象做了同样的事情.

模型

public class Season
{
    public int SeasonId { get; set; }
    public int ClubId { get; set; }
    public Club Club { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器代码

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", season.ClubId);
Run Code Online (Sandbox Code Playgroud)

视图

<div class="editor-label">
    @Html.LabelFor(model => model.ClubId, "Club")
</div>
<div class="editor-field">
    @Html.DropDownList("ClubId", String.Empty)
    @Html.ValidationMessageFor(model => model.ClubId)
</div>
Run Code Online (Sandbox Code Playgroud)

这很好用.

使用视图模型

但是现在我已经意识到页面需要的文本比我正在编辑的模型中显示的文本要多.我希望创建一个特殊的视图模型,编辑模型(季节)和我想要显示的额外文本.

视图模型

public class EditSeasonViewModel
{
    public string PlayerName {get; set;}
    public string SummaryText {get; set;}
    public int PlayerId {get; set;}
    public Season season {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我这样做了,更改控制器让HttpGet和HttpPost方法使用新的ViewModel,更改View以接受新的ViewModel,并更改视图中的所有'EditorFor'方法以使用model.season.MyProperty.

控制器代码

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", seasonVM.season.ClubId);
Run Code Online (Sandbox Code Playgroud)

代码在视图中

<div class="editor-label">
    @Html.LabelFor(model => model.season.ClubId, "Club")
</div>
<div class="editor-field">
    @Html.DropDownList("ClubId", String.Empty)
    @Html.ValidationMessageFor(model => model.season.ClubId)
</div>
Run Code Online (Sandbox Code Playgroud)

在调试HttpPost方法时,除了应该来自DropDropList的ClubId值之外,所有季节值都适当存在.

我没有改变View中的DropDownList,就像我们直接使用Model时一样.

问题: 我的问题是,在使用这个新版本时,我需要更改什么才能正确保存ClubId EditSeasonViewModel

另外,控制器中HttpGet方法中的ViewBag.ClubId如何与View中的DropDownList匹配,然后将其值传递回HttpPost方法?

mat*_*mmo 11

这是你的DropDownList声明是不正确的.试试这个:

@Html.DropDownListFor(m => m.season.ClubId, ViewBag.ClubId)
Run Code Online (Sandbox Code Playgroud)

实际上,您应该将选择列表放在模型中:

public SelectList Clubs { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后在控制器中填充它:

Model.Clubs = new SelectList(clubs, "ClubId", "Name", season.ClubId);
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

@Html.DropDownListFor(m => m.season.ClubId, Model.Clubs)
Run Code Online (Sandbox Code Playgroud)

  • +1使用强类型助手.[tag:asp.net-mvc]中的大多数下拉列表问题都是在ViewBag,弱类型助手和模型绑定问题中纠缠不清的结果. (2认同)