MVC3中如何将枚举类型绑定到下拉列表
### MVC3中如何将枚举类型绑定到下拉列表 在MVC3中,将枚举类型绑定到视图中的下拉列表是一个常见的需求。本文将详细介绍如何通过编写代码实现这一功能,包括创建模型、控制器逻辑以及自定义枚举转换为`SelectList`的方法。 #### 模型定义 在模型层定义了`RewardPwdModels`类: ```csharp public class RewardPwdModels { [Required] [StringLength(64, ErrorMessage = "用户名由6到64位字符组成", MinimumLength = 6)] [Display(Name = "用户名")] public string UserName { get; set; } [Required] [StringLength(128, ErrorMessage = "密保问题", MinimumLength = 1)] [Display(Name = "密保问题")] public string SecurityQuestion { get; set; } [Required] [StringLength(128, ErrorMessage = "密保答案", MinimumLength = 1)] [Display(Name = "密保答案")] public string SecurityAnswer { get; set; } [Required] [Display(Name = "发送方式")] public int SendType { get; set; } } ``` 此模型包含了用户输入的必要信息,如用户名、密保问题及其答案,以及发送方式的选择。这里需要注意的是`SendType`属性,它将与枚举绑定。 #### 枚举定义 接着定义了一个枚举`SendTypes`(原代码中的`SendTypes`类被误用了,应该修改为枚举): ```csharp public enum SendTypes { [EnumDisplayNameAttribute("密码发送到手机")] Phone = 10000, [EnumDisplayNameAttribute("密码发送到网站")] Http = 10001, [EnumDisplayNameAttribute("密码发送到邮箱")] Email = 10002 } ``` 为了使枚举项具有友好的显示名称,使用了自定义属性`EnumDisplayNameAttribute`(需自行定义或使用现有的属性)。这些枚举值将被映射到下拉列表的选项中。 #### 控制器处理 控制器部分涉及对`RewardPwdModels`实例的操作: ```csharp [Authorize] [HttpPost] public ActionResult RewardPwd(RewardPwdModels rewardPwdModels) { string userName = rewardPwdModels.UserName; string securityAnswer = rewardPwdModels.SecurityAnswer; string securityQuestion = rewardPwdModels.SecurityQuestion; int sendType = rewardPwdModels.SendType; var tres = WcfClient.RecoverPwd(userName, sendType); if (tres.Succed) { FormsAuthentication.SetAuthCookie(userName, true); return RedirectToAction("LogOn", "Account"); } return View(rewardPwdModels); } ``` 此方法接收表单提交的数据,并根据用户的请求执行相应的逻辑。 #### 枚举转换至SelectList 为了让枚举能够正确地绑定到下拉列表,需要编写一个辅助方法来将枚举转换为`SelectList`对象: ```csharp public static class DropList { public static List<SelectListItem> ToSelectList<TEnum>(this TEnum enumValue) { if (!typeof(TEnum).IsEnum) throw new ArgumentException("必须是枚举类型", nameof(enumValue)); var fields = typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static); foreach (var item in fields) { if (!item.IsDefined(typeof(EnumDisplayNameAttribute), true)) throw new ArgumentException("未套用EnumDisplayNameAttribute", nameof(enumValue)); } var values = from e in fields select new SelectListItem { Text = e.GetCustomAttribute<EnumDisplayNameAttribute>().DisplayName, Value = ((int)e.GetValue(null)).ToString(), Selected = (int)e.GetValue(null) == (int)enumValue }; return values.ToList(); } } ``` 此方法遍历枚举的所有字段,并获取每个字段的显示名称。然后,创建一个新的`SelectListItem`实例,其中包含每个枚举值的文本和值。返回一个包含所有`SelectListItem`的列表。 #### 视图层展示 在视图层,可以通过以下方式将枚举转换后的`SelectList`绑定到下拉列表: ```html @Html.DropDownListFor(model => model.SendType, Model.SendType.ToSelectList(), "请选择发送方式") ``` 这里的`Model.SendType.ToSelectList()`调用了我们之前定义的方法,将枚举转换为`SelectList`,并将其传递给`DropDownListFor`辅助方法。此外,“请选择发送方式”作为默认显示的选项。 通过以上步骤,我们可以成功地将枚举类型绑定到MVC3应用的下拉列表中。这种方式不仅提高了代码的可读性和可维护性,还使得用户界面更加友好和直观。
- 吉普赛的歌2013-10-08还行吧, 有点思路
- SD51522013-05-05学习了。不过效果不太好
- 粉丝: 5
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助