MVC 3 - 脚手架下拉列表

时间:2011-04-17 10:36:18

标签: asp.net-mvc asp.net-mvc-3 scaffolding

我正在使用Asp.net mvc中的Scaffolding

我的国家视图模型中有一个属性

public IEnumerable<SelectListItem> Countries { get; set; }

然而,当我创建一个视图并指定viewmodel时,它并没有像我预期的那样支持下拉列表。事实上它完全被忽略了。

我在编写项目之前已经编译了

我也尝试过添加像这样的属性

public int CountryId { get; set; }

正如本文所说,有一项工作惯例

http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/

我正在使用右键单击控制器操作方法时的添加视图选项

任何想法有什么不对?

3 个答案:

答案 0 :(得分:5)

在我目前的项目中,我遇到了这个问题,并且找不到一种快速的方法来支持我的一个实体内的一对多关系的下拉列表。

我最终做的事情如下:

1-创建正常的AddView =&gt;创建方式。

2-如果我的模型类中有一个ID属性,那么defaul; t模板将在我的视图中生成类似这样的属性:

<div class="editor-label">
                @Html.LabelFor(model => model.CityID)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.CityID)
                @Html.ValidationMessageFor(model => model.CityID)
</div>

3-现在我需要用一个工作的模板替换这个默认模板,所以我用CREATE方法编写了这段代码:

IEnumerable<SelectListItem> cityItems = dataContext.Cities.AsEnumerable().Select(c => new SelectListItem()
            {
                Text = c.Name,
                Value = c.ID.ToString(),
                Selected = false,
            });
            SelectList cityList = new SelectList(cityItems, "Value", "Text");
            ViewBag.CityList = cityList;

这将获取Cities表并创建一个Selectlist,我可以将其传递给我的视图并使用它来为DrobDown提供它的项目。

4-将我的视图中的默认代码替换为以下内容:

<div class="Post-label">
                        <div class="editor-label">
                            @Html.LabelFor(model => model.CityID)
                        </div>
                        <div class="editor-field">
                          @Html.DropDownListFor(m => m.CityID, ViewData["CityList"] as SelectList)
                            @Html.ValidationMessageFor(model => model.CityID)
                        </div>
</div>

我使用ViewData["CityList"]代替ViewBag.CityList的原因是这个有效,但另一个没有。

5-现在我的视图正在查找并且正在获取City数据,就像我预期的那样,并且在我的Edit视图中使用相同的模型也导致了一个工作。

尝试一下,让我知道发生了什么,谢谢。

答案 1 :(得分:4)

我注意到对于给定的模型,创建新控制器时“创建”脚手架生成的代码与右键单击现有控制器并说“添加视图”并选择“创建”脚手架不同模板。在第一种情况下,假设您在子类

上具有正确的属性
public Country Country {get;set;}
public int CountryID {get;set;}

然后这种情况(添加带有MVC脚手架读/写的控制器和适当的Model类)将为父关系生成@ Html.DropDownList,而在控制器中右键单击Create方法将不会支持下拉列表但是将而是为关系创建一个@ Html.EditorFor。

因此,如果您希望脚手架代码生成下拉列表,答案可能是删除并重新创建控制器(如果可能),否则请手动添加适当的代码。

答案 2 :(得分:1)

为了能够选择带下拉列表的国家/地区,您的模型中的属性应为:

public Country Country{ get; set; } EF使用的导航属性,不涉及数据库

public Country CountryId{ get; set; }  在Person表

上创建外键

一个人的每个实例/记录都与一个国家/地区相关联:通过代码和数据库的CountryID,使用导航属性定义关系。 然后,脚手架模板将使用:

生成编辑/创建方法和视图
ViewBag.PossibleCountries

Here's a similar scenario.