ASP.NET MVC中的枚举处理

在ASP.NET MVC开发中,枚举(Enum)类型是一种常用的数据类型,用于定义一组命名的常量。然而,枚举类型在视图中的显示和处理并不总是那么直观。本文将介绍如何在ASP.NET MVC中有效地处理枚举类型,特别是如何将枚举转换为下拉列表,并自定义其显示方式。

在早期版本的ASP.NET MVC中,开发者经常遇到将枚举转换为下拉列表的难题。虽然有许多解决方案,但这些方法往往不够简单直观。随着MVC 5.1的发布,ASP.NET MVC终于原生支持了枚举在视图中的显示。尽管旧的方法仍然可用,但新的方法更为简单,因此本文将主要介绍新的方法。

软件需求

要开始本文的示例,需要以下工具:

  • Visual Studio 2012: 下载ASP.NET和Web工具2013.1 for Visual Studio 2012。
  • Visual Studio 2013: 下载Visual Studio 2013 Update 1。这个更新是编辑ASP.NET MVC5.1 Razor视图所必需的。

安装好工具后,可以开始创建一个ASP.NET Web应用程序。为了演示枚举支持,将构建一个简单的学生注册表单,其中包含性别和国家这两个下拉列表供用户选择。

枚举定义

首先,定义两个枚举类型:性别(Gender)和国家(Country)。性别枚举包含男性(Male)和女性(Female),而国家枚举包含五个国家:澳大利亚(Australia)、孟加拉国(Bangladesh)、英格兰(England)、法国(France)和美国(Usa)。

public enum Gender { Male, Female } public enum Country { Australia, Bangladesh, England, France, Usa }

接下来,定义一个学生实体(POCO类),包含学生的ID、姓名、性别和国家。

public class Student { public int Id { get; set; } public string Name { get; set; } public Gender Gender { get; set; } public Country Country { get; set; } }

使用Scaffolding生成视图

如果仅仅依赖Scaffolding来生成视图,可能会遇到一些问题。例如,Scaffolding生成的视图可能无法正确渲染枚举类型的下拉列表。这是因为EditorFor()扩展方法不知道如何渲染枚举类型,因此它会使用默认设置,将枚举渲染为文本框。

为了解决这个问题,需要更新Microsoft ASP.NET MVC NuGet包。更新后,可以修改视图的标记,使用新的EnumDropDownListFor()扩展方法来渲染枚举类型的下拉列表。

@Html.EnumDropDownListFor(model => model.Gender)

通过这行代码,可以轻松地将枚举转换为下拉列表。接下来,可以考虑如何自定义枚举的显示方式。例如,可以使用Display属性来显示特殊字符或空格。

public enum Country { Australia, Bangladesh, England, France, [Display(Name = "United States")] Usa }

在视图中,可以看到“United States”代替了“Usa”显示在下拉列表中。但是,如果创建一个新的学生并保存,然后重新查看,会发现列表中显示的是“Usa”而不是“United States”。为了解决这个问题,可以使用显示模板。

显示模板

显示模板是一种自定义枚举显示方式的方法。需要在/Shared/DisplayTemplates文件夹中创建一个名为enum.cshtml的视图。在这个视图中,可以定义如何显示枚举类型。

@model Enum @if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata)) { string displayName = null; foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model)) { if (item.Selected) { displayName = item.Text ?? item.Value; } } if (String.IsNullOrEmpty(displayName)) { if (Model == null) { displayName = String.Empty; } else { displayName = Model.ToString(); } } @Html.DisplayTextFor(model => displayName) } else { @Html.DisplayTextFor(model => model) }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485