我正在构建一个简单的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生成的模型表现得与人们预期的不同等等)?
再次感谢。
答案 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);
}