ASP.NET MVC基于DB调用填充DropDownListFor

时间:2013-01-10 16:59:28

标签: asp.net-mvc-3 entity-framework-4

我正在构建一个简单的ASP.NET MVC 3站点,使用Entity Framework基于现有Oracle数据库中的某些表构建模型(换句话说,我使用'数据库优先'方法来构建我的模型)。我现在有一个简单的博客类型网站,我很熟悉,因为我一直在学习多种语言的MVC。

我想更改一些自动生成的视图。我想特别改变的一件是我在我的一个表中有一个名为'Visible'的字段。这只是一个数值(0或1),表示显示应用程序是否应该使用该行作为显示数据。目前,我有一个自动生成的简单文本字段:

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

我想要做的是将其替换为带有字符串值(如True和False)的下拉框。应用程序应显示任何带0的条目为false,反之亦然。如果用户想要翻转切换按钮,则下拉菜单应该允许他们这样做并理解在单击提交时进行数字更新。怎么办呢?

我已经看到了无数的示例,其中下拉列表将填充更多只有两个值,在这些情况下,我了解您可以向控制器添加逻辑,以获取所有不同的值,将它们放入列表,然后将列表添加到ViewBag。但是,在我的情况下只有两个可能的数值,似乎应该有一个更简单,更容易接受的方法。

非常感谢任何帮助。

更新

根据Quinton的回答,我试图将所述代码放入我的模型中。这是我目前的模特:

    namespace CurrentActivityBlog
    {
        using System;
        using System.Collections.Generic;
        using System.Web.UI.WebControls;

        public partial class TBLCURRENTACTIVITY
        {
            public string TITLE { get; set; }
            public string DESCRIPTION { get; set; }
            public System.DateTime DATETIME { get; set; }
            public short VISIBLE { get; set; }
            public decimal ID { get; set; }

            public IEnumerable<SelectedListItem> PossibleValues { get; set; }

        public TBLCURRENTACTIVITY() {
          PossibleValues = new[] { new SelectListItem { Value = "0", Text = "Hidden"       },              
              new SelectListItem { Value = "1", Text = "Visible" } }; 
        }

        }
    }

我无法构建此解决方案,但Visual Studio 2010告诉我

“无法找到类型或命名空间名称'SelectedListItem'(您是否缺少using指令或程序集引用?)”

如你所见,我有

使用System.Web.UI.controls

并添加了对System.Web的引用。有什么我忘记的,或者我应该知道的任何事情(例如使用EF生成的模型表现得与人们预期的不同等等)?

再次感谢。

1 个答案:

答案 0 :(得分:1)

一线解决方案是:

@Html.DropDownList(Model.VISIBLE.ToString(), new [] {new SelectListItem { Value = "0", Text = "Hidden"}, new SelectListItem { Value = "1", Text = "Visible"}}) 

但您可能不希望在视图中使用域逻辑。因此,可能的项目添加到您的模型(或从控制器):

    public class MyModel {
        public int VISIBLE { get; set; }
        public IEnumerable<SelectListItem> PossibleValues { get; set; }

        public MyModel() {
            PossibleValues = new[] { new SelectListItem { Value = "0", Text = "Hidden" }, new SelectListItem { Value = "1", Text = "Visible" } }; 
        }
    }

然后你的剃刀代码:

    @Html.DropDownList(Model.VISIBLE.ToString(), Model.PossibleValues)

显然,“隐藏”和“可见”描述可以替换为“假”和“真”或其他。

您还可以为该特定字段创建Editor and Display Template。查看ScottGu的博客文章here,搜索“UI帮助模板支持”,您将看到如何创建编辑器模板以及如何按名称呈现特定模板。

修改

如果您的模型不是MVC项目的一部分,那么引用MVC程序集中的任何类都需要显式的添加引用。您可以通过从控制器初始化模型中的任何MVC程序集类型来避免这种情况,例如:

    public class MyModel {
            public int VISIBLE { get; set; }
            public IEnumerable<SelectListItem> PossibleValues { get; set; }
    }

控制器动作方法:

    public ActionResult Edit(int Id) {
        ...
        myModelInstance. PossibleValues = new[] { new SelectListItem { Value = "0", Text = "Hidden" }, new SelectListItem { Value = "1", Text = "Visible" } }; 
        ...
        Return View(myModel);
    }