mvc html 获取枚举值,关于html:将枚举绑定到MVC 4中的DropDownList?

本问题已经有最佳答案,请猛点这里访问。

我一直在各地发现,将枚举绑定到下拉列表的常见方法是通过helper方法,对于这样一个看似简单的任务,helper方法似乎有点霸道。

在ASP.NET MVC 4中将枚举绑定到DropDownList的最佳方法是什么?

@谢里丹有点晚了,你不同意吗?

不,我完全不同意。在我看到你的问题之前,我不可能把它标记为副本,对吗?如果您对此有一些问题,也许您应该阅读为什么有些问题标记为重复?堆栈溢出帮助中心的页面,而不是留下无意义的注释?

你可以这样做:

@Html.DropDownListFor(model => model.Type, Enum.GetNames(typeof(Rewards.Models.PropertyType)).Select(e => new SelectListItem { Text = e }))

谢谢。要包含枚举的int值,只需如下扩展:...{ Text = e, Value = ((int)Enum.Parse(typeof(UngKlub.Web.Models.Member.GenderEnum‌​), e)).ToString() }))。

如果你想的话,最好用带[标记]的枚举

我认为这是唯一(干净)的方法,这是一个遗憾,但至少有几个选择。我建议你看看这个博客:http://paulthecyclist.com/2013/05/24/enum-dropdown/

抱歉,在这里复制太长,但要点是他为此创建了一个新的HTML助手方法。

所有源代码在GitHub上都可用。

这个问题回答了这个答案的要点:stackoverflow.com/questions/388483/…以及许多解决这个问题的其他方法。

保尔骑车人的建议很好,但他在那篇文章中遗漏了很多细节…最好直接去他的Github。虽然谢谢

如果有人感兴趣(我知道op指定了MVC 4),MVC 5.1支持枚举:asp.net/mvc/overview/release s/mvc51 release notes enum

这里有更好的解决方案。stackoverflow.com/questions/388483/…

正如伯纳德所说,MVC5.1现在涵盖了这一点,如果您能够使用该版本的话。我已经写了一篇新的博客文章paulthecyclist.com/2014/04/03/enum-dropdown-mvc5-1,这是基于我之前的一篇文章,它展示了一种利用它的方法,并且仍然可以从resx文件中获取下拉值。

保尔骑自行车的岗位是超级干净,易于遵循。还可以检查Github回购。感谢您提供资源。

自MVC 5.1以来,框架支持枚举:

@Html.EnumDropDownListFor(m => m.Palette)

可自定义显示的文本:

public enum Palette

{

[Display(Name ="Black & White")]

BlackAndWhite,

Colour

}

msdn链接:http://www.asp.net/mvc/overview/releases/mvc51 release notes enum

完美且易于使用:)

在我的控制器中:

var feedTypeList = new Dictionary();

foreach (var item in Enum.GetValues(typeof(FeedType)))

{

feedTypeList.Add((short)item, Enum.GetName(typeof(FeedType), item));

}

ViewBag.FeedTypeList = new SelectList(feedTypeList,"Key","Value", feed.FeedType);

在我看来:

@Html.DropDownList("FeedType", (SelectList)ViewBag.FeedTypeList)

当我执行编辑操作时,下拉列表中没有选择值绑定?请帮助

从技术上讲,您不需要辅助方法,因为Html.DropdownListFor只需要SelectList或Ienumerable。您可以将枚举转换成这样的输出,然后以这种方式馈送它。

我使用静态库方法将枚举转换为List中的一些参数/选项:

public static List GetEnumsByType(bool useFriendlyName = false, List exclude = null,

List eachSelected = null, bool useIntValue = true) where T : struct, IConvertible

{

var enumList = from enumItem in EnumUtil.GetEnumValuesFor()

where (exclude == null || !exclude.Contains(enumItem))

select enumItem;

var list = new List();

foreach (var item in enumList)

{

var selItem = new SelectListItem();

selItem.Text = (useFriendlyName) ? item.ToFriendlyString() : item.ToString();

selItem.Value = (useIntValue) ? item.To().ToString() : item.ToString();

if (eachSelected != null && eachSelected.Contains(item))

selItem.Selected = true;

list.Add(selItem);

}

return list;

}

public static class EnumUtil

{

public static IEnumerable GetEnumValuesFor()

{

return Enum.GetValues(typeof(T)).Cast();

}

// other stuff in here too...

}

///

/// Turns Camelcase or underscore separated phrases into properly spaces phrases

///"DogWithMustard".ToFriendlyString() =="Dog With Mustard"

///

public static string ToFriendlyString(this object o)

{

var s = o.ToString();

s = s.Replace("__"," /").Replace("_","");

char[] origArray = s.ToCharArray();

List newCharList = new List();

for (int i = 0; i < origArray.Count(); i++)

{

if (origArray[i].ToString() == origArray[i].ToString().ToUpper())

{

newCharList.Add(' ');

}

newCharList.Add(origArray[i]);

}

s = new string(newCharList.ToArray()).TrimStart();

return s;

}

您的视图模型可以传递您想要的选项。这是一个相当复杂的问题:

public IEnumerable PaymentMethodChoices

{

get

{

var exclusions = new List { Membership.Payment.PaymentMethod.Unknown, Membership.Payment.PaymentMethod.Reversal };

var selected = new List { this.SelectedPaymentMethod };

return GetEnumsByType(useFriendlyName: true, exclude: exclusions, eachSelected: selected);

}

}

因此,您将视图的DropDownList连接到Ienumerable属性。

保尔骑手的解决方案就在眼前。但是我不会使用resx(我必须为每个新枚举添加一个新的.resx文件??)

下面是我的htmlhelper表达式:

public static MvcHtmlString EnumDropDownListFor(this HtmlHelper htmlHelper,

Expression> expression, object attributes = null)

{

//Get metadata from enum

var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

var enumType = GetNonNullableModelType(metadata);

var values = Enum.GetValues(enumType).Cast();

//Convert enumeration items into SelectListItems

var items =

from value in values

select new SelectListItem

{

Text = value.ToDescription(),

Value = value.ToString(),

Selected = value.Equals(metadata.Model)

};

//Check for nullable value types

if (metadata.IsNullableValueType)

{

var emptyItem = new List

{

new SelectListItem {Text = string.Empty, Value = string.Empty}

};

items = emptyItem.Concat(items);

}

//Return the regular DropDownlist helper

return htmlHelper.DropDownListFor(expression, items, attributes);

}

以下是我如何声明我的枚举:

[Flags]

public enum LoanApplicationType

{

[Description("Undefined")]

Undefined = 0,

[Description("Personal Loan")]

PersonalLoan = 1,

[Description("Mortgage Loan")]

MortgageLoan = 2,

[Description("Vehicle Loan")]

VehicleLoan = 4,

[Description("Small Business")]

SmallBusiness = 8,

}

从剃刀的角度来看,这是一个要求:

@Html.EnumDropDownListFor(m => m.LoanType, new { @class ="span2" })

其中,@Model.LoanType是LoanApplicationType类型的模型属性

更新:抱歉,忘记包含helper函数todescription()的代码

///

/// Returns Description Attribute information for an Enum value

///

///

///

public static string ToDescription(this Enum value)

{

if (value == null)

{

return string.Empty;

}

var attributes = (DescriptionAttribute[]) value.GetType().GetField(

Convert.ToString(value)).GetCustomAttributes(typeof (DescriptionAttribute), false);

return attributes.Length > 0 ? attributes[0].Description : Convert.ToString(value);

}

嗨,如果您要使用基于我的博客的解决方案,那么对于所有枚举,您只需要一个resx文件,并使用约定来区分枚举。例如,如果你有两个枚举,颜色和数字就表示。有些resx条目可能有如下名称:colour_blue、colour_red、colour_white、loanApplicationType_undefined、loanApplicationType_personal。但是,如果您的Web应用程序不需要考虑本地化,那么description属性可以正常工作。

我想如果你需要本地化多种语言是有意义的。在我不得不使用resx文件的时候,我通常用自定义的dataannotationattribute对枚举进行decor,并直接在枚举上设置资源文件条目。但我想你的方法会更舒服。我会在不久的将来试一试(谢谢)

扩展HTML助手以使其正常工作,但是如果您希望能够基于DisplayAttribute映射更改下拉值的文本,则需要对此进行类似的修改,

(执行MVC 5.1之前的操作,它包含在5.1+中)

public static IHtmlString EnumDropDownListFor(this HtmlHelper html, Expression> expression)

{

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

var enumType = Nullable.GetUnderlyingType(metadata.ModelType) ?? metadata.ModelType;

var enumValues = Enum.GetValues(enumType).Cast();

var items = enumValues.Select(item =>

{

var type = item.GetType();

var member = type.GetMember(item.ToString());

var attribute = member[0].GetCustomAttribute();

string text = attribute != null ? ((DisplayAttribute)attribute).Name : item.ToString();

string value = ((int)item).ToString();

bool selected = item.Equals(metadata.Model);

return new SelectListItem

{

Text = text,

Value = value,

Selected = selected

};

});

return html.DropDownListFor(expression, items, string.Empty, null);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值