我有一个名为ActionStatus的枚举,它具有2个可能的值:open = 0和close = 1
public enum ActionStatus
{
Open,
Closed
}
我想在编辑中构建单选按钮组,并创建使用枚举填充以下单选按钮的视图:a)创建视图中的默认值,b)编辑视图中当前选择的选项。
我是否需要一种扩展方法,并且有人已经创建了吗?
编辑:下面达林斯的答案后,这是我的模型类
namespace Actioner.Models
{
[MetadataType(typeof(MeetingActionValidation))]
public class MeetingAction
{
[Key]
public int MeetingActionId { get; set; }
[Required]
[Display(Name ="Description")]
public string Description { get; set; }
[Required]
[Display(Name ="Review Date")]
public DateTime ReviewDate { get ;set; }
public int Status{ get; set; }
[ScaffoldColumn(false)]
public int MeetingId { get; set; }
//public virtual Meeting Meeting { get; set; }
//public virtual ICollection Users { get; set; }
public virtual ICollection ActionUpdates { get; set; }
public MeetingActionStatus ActionStatus { get; set; }
}
public enum MeetingActionStatus
{
Open,
Closed
}
这是我的看法
@model Actioner.Models.MeetingAction
@using Actioner.Helpers
@Html.LabelFor(model => model.Description)
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
@Html.LabelFor(model => model.ReviewDate)
@Html.EditorFor(model => model.ReviewDate)
@Html.ValidationMessageFor(model => model.ReviewDate)
@Html.LabelFor(model => model.Status)
@Html.RadioButtonForEnum(x => x.ActionStatus)
这是我的创建控制器动作
public virtual ActionResult Create(int id)
{
var meetingAction = new MeetingAction
{
MeetingId = id,
ReviewDate = DateTime.Now.AddDays(7)
};
ViewBag.Title ="Create Action";
return View(meetingAction);
}
枚举在视图中显示正常,但是当前选择的选项未持久保存到数据库中
有没有一种方法可以从资源文件中检索打开和关闭值? 例如:[Display(名称="打开",ResourceType = typeof(Resources.Global),Order = 0)]打开。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
namespace YourNamespace
{
public static class HtmlExtensions
{
public static MvcHtmlString RadioButtonForEnum(
this HtmlHelper htmlHelper,
Expression> expression
)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var names = Enum.GetNames(metaData.ModelType);
var sb = new StringBuilder();
foreach (var name in names)
{
var id = string.Format(
"{0}_{1}_{2}",
htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
metaData.PropertyName,
name
);
var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
sb.AppendFormat(
"{1} {2}",
id,
HttpUtility.HtmlEncode(name),
radio
);
}
return MvcHtmlString.Create(sb.ToString());
}
}
}
您也可以对此辅助方法强制将通用约束应用于枚举类型。
接着:
模型:
public enum ActionStatus
{
Open,
Closed
}
public class MyViewModel
{
public ActionStatus Status { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel
{
Status = ActionStatus.Closed
});
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
视图:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.RadioButtonForEnum(x => x.Status)
}
为什么使用字符串生成器? 只是为了方便串联和格式化? 这似乎是一种非常非MVC的处理方式。
强制将枚举类型强制通用约束的Jon Skeets博客文章链接不再有效。
花了几分钟时间找出用于HtmlExtensions代码的正确using语句,所以我编辑了您的答案以包括它们。 希望你不介意。
只需为单选按钮添加标签
public static class HtmlExtensions
{
public static MvcHtmlString RadioButtonForEnum(
this HtmlHelper htmlHelper,
Expression> expression
)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var names = Enum.GetNames(metaData.ModelType);
var sb = new StringBuilder();
foreach (var name in names)
{
var description = name;
var memInfo = metaData.ModelType.GetMember(name);
if (memInfo != null)
{
var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
if (attributes != null && attributes.Length > 0 )
description = ((DisplayAttribute)attributes[0]).Name;
}
var id = string.Format(
"{0}_{1}_{2}",
htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
metaData.PropertyName,
name
);
var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
sb.AppendFormat(
"{1} {2}",
id,
HttpUtility.HtmlEncode(description),
radio
);
}
return MvcHtmlString.Create(sb.ToString());
}
}
和模型:
public enum MeetingActionStatus
{
[Display(Name ="Open meeting")]
Open,
[Display(Name ="Closed meeting")]
Closed
}
在模型上以及Display属性的扩展中使用十分有用,因为通常情况下,枚举描述无法实际以其原始格式显示。
我收到一个错误-System.Web.Mvc.HtmlHelper 不包含RadioButtonFor的定义,并且没有扩展方法RadioButtonFor接受类型为System.Web.Mvc.HtmlHelper 的第一个参数
尝试"使用System.Web.Mvc.Html;"