MVC 3 - 脚手架下拉列表

Posted

技术标签:

【中文标题】MVC 3 - 脚手架下拉列表【英文标题】:MVC 3 - Scaffolding drop down list 【发布时间】:2011-08-07 06:33:15 【问题描述】:

我正在玩 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/

我正在使用 添加视图 选项,当您在控制器操作方法中单击鼠标右键时

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

public Country Country get;set;
public int CountryID get;set;

那么这种情况(使用 MVC 脚手架读/写和适当的模型类添加控制器)将为父关系生成一个 @html.DropDownList,而在控制器 Create 方法中右键单击不会脚手架下拉但会而是为关系创建一个@Html.EditorFor。

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

【讨论】:

【参考方案2】:

为了能够通过下拉菜单选择国家/地区,您的模型中的属性应为:

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

public Country CountryId get; set; 在 Person 表上创建外键

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

ViewBag.PossibleCountries

Here's a similar scenario.

【讨论】:

【参考方案3】:

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

我最终做了如下:

1- 创建普通的AddView=>创建方式。

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 表并创建一个选择列表,我可以将其传递给我的视图并使用它为 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- 现在我的视图正在工作 find 并按照我的预期获取 City 数据,并且在我的 Edit 视图中使用相同的模型也得到了一个工作。

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

【讨论】:

感谢您的回复。我知道如何手动编写代码,我只是想找出为什么自动脚手架不适用于这种情况

以上是关于MVC 3 - 脚手架下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

单选按钮而不是 mvc 3 应用程序中的下拉列表?

如何在 ASP.NET MVC 3 中为填充的下拉列表创建视图模型

使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

下拉列表中的重复值 - MVC

使下拉列表依赖于 MVC Core 中的另一个下拉列表

MVC 视图 - 无法在选择下拉列表中填充列表