0

我正在构建一个简单的 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 的条目显示为假,反之亦然。如果用户想要翻转切换,下拉菜单应该允许他们这样做并理解在单击提交时进行数字更新。如何才能做到这一点?

我见过无数的例子,下拉列表将填充两个以上的值,在这些情况下,我知道您可以向控制器添加逻辑,以提取所有不同的值,将它们放入列表中,然后将列表添加到 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 生成的模型的行为与预期不同,等等)?

再次感谢。

4

1 回答 1

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 的博客文章,搜索“UI Helper Templating Support”,您将了解如何创建编辑器模板以及如何按名称呈现特定模板。

编辑:

如果您的模型不是 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);
    }
于 2013-01-10T17:30:22.783 回答