MVC 3 - 自动创建下拉列表

9

我正在使用Asp.net mvc中的脚手架进行操作。

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

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

然而,当我创建一个视图并指定视图模型时,它没有像我期望的那样生成下拉列表。实际上,它被完全忽略了。

在进行此操作之前,我已经编译了该项目。

我还尝试添加了一个属性,如下所示:

public int CountryId { get; set; }

作为本文所建议的,工作中存在一个约定。 http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/ 我正在使用控制器操作方法中右键单击时提供的添加视图选项。
有什么想法错在哪里?
3个回答

5
在我的当前项目中,我遇到了这个问题,并且找不到一种快速的方式来搭建一个实体内部的一对多关系的下拉列表。最终我做的如下:
1- 创建正常的AddView => Create方式。
2- 如果我的模型类中有一个ID属性,那么默认模板将生成类似于以下内容来表示此属性在我的视图中:
<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,我可以将其传递给我的视图,并使用它来提供DropDown的项目。

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
谢谢回复。我知道如何手动编码,我只是想弄清楚为什么自动脚手架在这种情况下不起作用。 - ChrisCa

4

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

public Country Country {get;set;}
public int CountryID {get;set;}

如果您想使用MVC脚手架生成可读写并带有适当模型类的控制器,那么这种情况将会生成一个@Html.DropDownList用于父关系,而在控制器Create方法中右键单击则不会自动生成下拉菜单,而是创建一个用于关系的@Html.EditorFor。

因此,如果您希望脚手架代码生成下拉菜单,则可能需要尝试删除和重新创建控制器,否则需要手动添加适当的代码。


1
为了在下拉菜单中选择国家的选项,您的模型中的属性应该是: public Country Country{ get; set; } //导航属性由EF使用,不涉及数据库
使用以下代码创建Person表上的外键: public Country CountryId{ get; set; } //每个人的实例/记录都与一个国家相关联:通过代码使用导航属性定义关系,并使用CountryID定义数据库。然后,脚手架模板将使用以下内容生成编辑/创建方法和视图:
ViewBag.PossibleCountries

这里有一个类似的情境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接