asp.net MVC 中枚举创建下拉列表?
我将尝试使用 Html.DropDownList 扩展方法,但不能找出如何使用它的枚举。
让我们说我有一个这样的枚举:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
如何着手创建下拉列表,这些值,使用 HTML'>Html.DropDownList 扩展名的方法?或者是我最好的方法,只需创建的循环,并手动创建 html 元素吗?
解决方法 1:
我滚进扩展方法的符文的答案:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new { ID = e, Name = e.ToString() };
return new SelectList(values, "Id", "Name", enumObj);
}
这使您可以编写:
ViewData["taskStatus"] = task.Status.ToSelectList();
解决方法 2:
我碰见了同样的问题,发现这个问题,并不是我在找什么 ; 灰而提供的解决方案的思想不必自己创建的 HTML 意味着少比作内置的 Html.DropDownList() 功能的灵活性。
原来 C# 3 等使这很容易。我有一个叫了任务状态的枚举:
var statuses = from TaskStatus s in Enum.GetValues(typeof(TaskStatus))
select new { ID = s, Name = s.ToString() };
ViewData["taskStatus"] = new SelectList(statuses, "ID", "Name", task.Status);
这将创建好的又 SelectList,像用来在视图中可用:
<td><b>Status:</b></td><td><%=Html.DropDownList("taskStatus")%></td></tr>
匿名类型和 LINQ 使这得更优雅的个人谦逊。没有犯罪意图,灰。:)
解决方法 3:
扩展企业和符文的答案,如果你想有你的选择列表项地图,枚举类型的整数值,而不是字符串值的值属性,请使用下面的代码:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct {
if(!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new { ID = (int)e, Name = e.ToString() };
return new SelectList(values, "ID", "Name", enumObj);
}
当作一个 TEnum 对象中的每个枚举值,而不是,我们可以把它当作一个对象,然后将其转换为整数,以获取未装箱的值。
注意:我还添加了一个泛型类型约束限制的类型,此扩展插件用于仅结构 (枚举的基类型),并确保传递中的结构实际上是枚举的运行时类型验证。
解决方法 4:
这样不扩展功能,如果您正在寻找简单和容易...这是我做的事
<%= Html.DropDownListFor(x => x.CurrentAddress.State, new SelectList(Enum.GetValues(typeof(XXXXX.Sites.YYYY.Models.State))))%>
凡 XXXXX。Sites.YYYY.Models.State 是一个枚举
可能更好地做 helper 函数,但是短时间时,这会完成这项工作。
解决方法 5:
Html.DropDownFor 只需要的例子,所以企业的解决方案的替代方法是,如下所示。
此外,你真的不必 genericize 扩展方法,您可以使用 enumValue.GetType(),而不是 typeof(T)。
public static IEnumerable<SelectListItem> ToSelectList(this Enum enumValue)
{
return from Enum e in Enum.GetValues(enumValue.GetType())
select new SelectListItem
{
Selected = e.Equals(enumValue),
Text = e.ToString(),
Value = e.ToString()
};
}
解决方法 6:
你想看看使用类似Enum.GetValues
解决方法 7:
要解决这个问题,得到的数字,而不是使用企业的扩展方法的文本。
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new { ID = (int)Enum.Parse(typeof(TEnum),e.ToString())
, Name = e.ToString() };
return new SelectList(values, "Id", "Name", enumObj);
}
解决方法 8:
我知道我迟到,一方,但认为您可能会发现此变体很有用,如这一还允许您使用描述性字符串,而不是枚举常量在下拉。为此,装饰用 [System.ComponentModel.Description] 属性的每个枚举项。
例如:
public enum TestEnum
{
[Description("Full test")]
FullTest,
[Description("Incomplete or partial test")]
PartialTest,
[Description("No test performed")]
None
}
这里是我的代码:
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type realModelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(realModelType);
if (underlyingType != null)
{
realModelType = underlyingType;
}
return realModelType;
}
private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };
public static string GetEnumDescription<TEnum>(TEnum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if ((attributes != null) && (attributes.Length > 0))
return attributes[0].Description;
else
return value.ToString();
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
return EnumDropDownListFor(htmlHelper, expression, null);
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type enumType = GetNonNullableModelType(metadata);
IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();
IEnumerable<SelectListItem> items = from value in values
select new SelectListItem
{
Text = GetEnumDescription(value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
};
// If the enum is nullable, add an 'empty' item to the collection
if (metadata.IsNullableValueType)
items = SingleEmptyItem.Concat(items);
return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
}
然后可以在您的视图中:
<%: Html.EnumDropDownListFor(model => model.MyEnumProperty) %>
希望这有助于您 !
解决方法 9:
这是我的帮助器方法的版本。我使用它:
var values = from int e in Enum.GetValues(typeof(TEnum))
select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };
而不是,:
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new { ID = (int)Enum.Parse(typeof(TEnum),e.ToString())
, Name = e.ToString() };
在这里:
public static SelectList ToSelectList<TEnum>(this TEnum self) where TEnum : struct
{
if (!typeof(TEnum).IsEnum)
{
throw new ArgumentException("self must be enum", "self");
}
Type t = typeof(TEnum);
var values = from int e in Enum.GetValues(typeof(TEnum))
select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };
return new SelectList(values, "ID", "Name", self);
}
解决方法 10:
嗨,
我试着企业的解决方案,看起来很酷,只遇见了一个重要的问题。在此扩展方法的 selectList,DataValue 不是常数的枚举,但 DataText 相同的索引。我有:
<select id="type" name="type">
<option value="Item1">Item1</option>
<option selected="selected" value="Item2">Item2</option>
<option value="Item3">Item3</option>
</select>
和我想要:
<select id="type" name="type">
<option value="1">Item1</option>
<option selected="selected" value="2">Item2</option>
<option value="3">Item3</option>
</select>
感谢您的帮助
解决方法 11:
此扩展方法的另一个修补程序的当前版本没有选择枚举的当前值。我定的最后一行:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
{
if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");
var values = from TEnum e in Enum.GetValues(typeof(TEnum))
select new
{
ID = (int)Enum.Parse(typeof(TEnum), e.ToString()),
Name = e.ToString()
};
return new SelectList(values, "ID", "Name", ((int)Enum.Parse(typeof(TEnum), enumObj.ToString())).ToString());
}
解决方法 12:
如果您想要添加本地化支持只需更改的 s.toString() 方法,是这样的:
ResourceManager rManager = new ResourceManager(typeof(Resources));
var dayTypes = from OperatorCalendarDay.OperatorDayType s in Enum.GetValues(typeof(OperatorCalendarDay.OperatorDayType))
select new { ID = s, Name = rManager.GetString(s.ToString()) };
在这里,typeof(Resources) 是要加载的资源,然后你也很有用,如果您的枚举值包含多个单词的本地化的字符串。
在一次项目中需要把枚举的值添加到Combox中去,需要对枚举进行操作。经过学习总结如下,也便于以后查询:
public enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };
1.根据name获得Enum的类型:
Colors mycolor = (Colors)Enum.Parse(typeof(Colors),"red",true);
(int)mycolor1=1
2.根据value获得Enum的类型:
Colors mycolor = (Colors)Enum.Parse(typeof(Colors),"1",true);
mycolor2.ToString()=Red
3.遍历枚举内容
foreach(string s in Enum.GetNames(typeof(Colors)))
{
//to do
}
4.怎样确定一个名称或值是枚举中的一个
Enum.IsDefined(typeof(myenum),object(name or value))
5.怎样确定一个类型: Type t = mycolor.GetType();
Type t1 =typeof(Colors);
Type t2 = Type.GetType("namespace.Colors");
补充:
Colors myOrange = (Colors)Enum.Parse(typeof(Colors), "Red, Blue,Yellow");
The myOrange value has the combined entries of [myOrange.ToString()]=13
Colors myOrange2 = (Colors)Enum.Parse(typeof(Colors), "Red, Blue");
The myOrange2 value has the combined entries of [myOrange2.ToString()]=5
另:
x.gettype和typeof的用法
1.判断某个实例是否某个类型
c# o is classname
vb typeof o is classname//必须是引用类型。typeof且必须和is联用
2.c# typeof(int)
bv gettype(integer)
3.object类的方法
c# o.GetType
vb o.GetType
asp.net MVC 中枚举创建下拉列表?的更多相关文章
- ASP.NET MVC 中枚举生成下拉框
最近公司在开发财务系统,在工作中遇到不少的地方需要下拉框. 但是枚举框中数据的内容又来自枚举. 枚举代码如下: public class EnumDemo { public enum Value { ...
- ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)
在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序 ...
- 为ASP.NET MVC应用程序创建更复杂的数据模型
为ASP.NET MVC应用程序创建更复杂的数据模型 2014-05-07 18:27 by Bce, 282 阅读, 1 评论, 收藏, 编辑 这是微软官方教程Getting Started wit ...
- Asp.net mvc 中的 Controller 的激活
Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...
- ASP.NET MVC中商品模块小样
在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...
- ASP.NET与ASP.NET MVC 中Cache的总结
Cache有多种翻译,可以是高速缓冲存储器,也可以是法国的服装品牌,本文只是简单的谈谈就是ASP.NET 中Cache,做过Web应用程序的都知道,如果网站访问量比较大,系统应用程序可以将那些频繁访问 ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- 2.ASP.NET MVC 中使用Crystal Report水晶报表
上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...
随机推荐
- TS学习之函数
定义函数类型(规定函数参数及函数返回值的类型,若函数没有返回值,则返回类型为null) function add(x: number, y: number): number { return x + ...
- mysql数据库之表与表之间的关系
表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 ...
- C语言学习笔记--const 和 volatile关键字
1.const关键字 (1)const 修饰的变量是只读的,它不是真正的常量,本质还是变量,只是告诉编译器不能出现在赋值号左边! (2)const 修饰的局部变量在栈上分配空间 (3)const 修饰 ...
- vue.js解决刷新404找不到页面问题
1.将包解压到ROOT目录后创建WEB-INF目录 mkdir WEB-INF 2.进入WEB-INF目录,创建web.xml文件 cd WEB-INF touch web.xml 3.编辑web.x ...
- java 学习众多API和手册资源下载
这个资源包里面有jdk api 还有SSH框架的手册,数据库的手册,Jquery手册等等,还有正则表达式等, 希望可以帮助有需要的人 链接:http://希望pan.baidu.com/s/1pJ60 ...
- 创建sharepoint网站
1.首先打开管理中心 输入用户名和密码(默认是本机的管理员名称及密码) 在“应用程序管理”选择“管理WEB应用程序” 新建应用程序 选择一个没有占用的端口,选择允许匿名访问 数据库名称一般为WSS_C ...
- VIewPage+Fragment
效果图: 代码 public class NewOrderListFargmentActivity extends BaseActivity implements OnClickListener { ...
- [codeforces821E]Okabe and El Psy Kongroo
题意:(0,0)走到(k,0),每一部分有一条线段作为上界,求方案数. 解题关键:dp+矩阵快速幂,盗个图,注意ll 关于那条语句为什么不加也可以,因为我的矩阵C,就是因为多传了了len的原因,其他位 ...
- 实现one hot encode独热编码的两种方法
实现one hot encode的两种方法: https://stackoverflow.com/questions/37292872/how-can-i-one-hot-encode-in-pyth ...
- nginx优化配置大全
由于面试被问到nginx优化做过哪些 后来发现,其实做过的也不少,忘了的更不少,因此写个博客记录一下(里面有一些内容来源于其他作者). 配置文件样例为生产环境样例. 1.nginx基本优化 安装方式有 ...