MVC3剃刀DropDownListFor枚举 [英] MVC3 Razor DropDownListFor Enums
问题描述
试图让我的项目更新到MVC3,这是我无法找到:
Trying to get my project updated to MVC3, something I just can't find:
我有ENUMS的简单数据类型:
I have a simple datatype of ENUMS:
public enum States()
{
AL,AK,AZ,...WY
}
,我想在我的模型来看一个下拉/的SelectList包含此数据类型的使用方法:
Which I want to use as a DropDown/SelectList in my view of a model that contains this datatype:
public class FormModel()
{
public States State {get; set;}
}
pretty直截了当:当我去使用自动生成视图此部分类,它忽略了这种类型的
Pretty straight forward: when I go to use the auto-generate view for this partial class, it ignores this type.
我需要设置枚举,当我打通过我的AJAX提交和处理所选项目的值的简单选择列表 - JSON POST方法。
I need a simple select list that sets the value of the enum as the selected item when I hit submit and process via my AJAX - JSON POST Method.
和超过视图(?!)
<div class="editor-field">
@Html.DropDownListFor(model => model.State, model => model.States)
</div>
在此先感谢您的意见!
thanks in advance for the advice!
推荐答案
我刚刚做了一个我自己的项目。下面的code是我的助手类的一部分,我希望我所需要的所有方法。写评论,如果它不工作,我会再次检查。
I've just made one for my own project. The code below is part of my helper class, I hope that I got all methods needed. Write a comment if it doesn't work, and I'll check again.
public static class SelectExtensions
{
public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
if (expression.Body.NodeType == ExpressionType.Call)
{
MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
string name = GetInputName(methodCallExpression);
return name.Substring(expression.Parameters[0].Name.Length + 1);
}
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
private static string GetInputName(MethodCallExpression expression)
{
// p => p.Foo.Bar().Baz.ToString() => p.Foo OR throw...
MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
if (methodCallExpression != null)
{
return GetInputName(methodCallExpression);
}
return expression.Object.ToString();
}
public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
string inputName = GetInputName(expression);
var value = htmlHelper.ViewData.Model == null
? default(TProperty)
: expression.Compile()(htmlHelper.ViewData.Model);
return htmlHelper.DropDownList(inputName, ToSelectList(typeof(TProperty), value.ToString()));
}
public static SelectList ToSelectList(Type enumType, string selectedItem)
{
List<SelectListItem> items = new List<SelectListItem>();
foreach (var item in Enum.GetValues(enumType))
{
FieldInfo fi = enumType.GetField(item.ToString());
var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
var listItem = new SelectListItem
{
Value = ((int)item).ToString(),
Text = title,
Selected = selectedItem == ((int)item).ToString()
};
items.Add(listItem);
}
return new SelectList(items, "Value", "Text", selectedItem);
}
}
使用它作为:
Html.EnumDropDownListFor(m => m.YourEnum);
更新
我创建的替代HTML辅助。所有你需要做的,用它们是改变你的baseviewpage在的意见\\的web.config
。
I've created alternative Html Helpers. All you need to do to use them is to change your baseviewpage in views\web.config
.
有了他们,你可以这样做:
With them you can just do:
@Html2.DropDownFor(m => m.YourEnum);
@Html2.CheckboxesFor(m => m.YourEnum);
@Html2.RadioButtonsFor(m => m.YourEnum);
此处了解详情:<一href=\"http://blog.gauffin.org/2011/10/first-draft-of-my-alternative-html-helpers/\">http://blog.gauffin.org/2011/10/first-draft-of-my-alternative-html-helpers/
这篇关于MVC3剃刀DropDownListFor枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!