mvc html.radiobutton,关于asp.net mvc:将枚举传递给html.radiobuttonfor MVC3

我有一个名为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;"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值