Пытаюсь обновить свой проект до MVC3, но я просто не могу найти:
У меня есть простой тип данных ENUMS:
public enum States()
{
AL,AK,AZ,...WY
}
Который я хочу использовать как DropDown / SelectList в моем представлении о модели, содержащей этот тип данных:
public class FormModel()
{
public States State {get; set;}
}
Довольно прямолинейно: когда я использую автоматическое создание представления для этого частичного класса, он игнорирует этот тип.
Мне нужен простой список выбора, который устанавливает значение перечисления в качестве выбранного элемента, когда я нажимаю отправить и обработать с помощью моего метода AJAX - JSON POST.
А чем вид (???!):
<div class="editor-field">
@Html.DropDownListFor(model => model.State, model => model.States)
</div>
заранее спасибо за совет!
c#
asp.net-mvc-3
razor
jordan.baucke
источник
источник
Ответы:
Я только что сделал один для своего проекта. Приведенный ниже код является частью моего вспомогательного класса, я надеюсь, что у меня есть все необходимые методы. Напишите комментарий, если не получится, и я еще раз проверю.
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. Все, что вам нужно сделать, чтобы использовать их, - это изменить вашу базовую страницу в формате
views\web.config
.С ними можно просто:
Подробнее здесь: http://blog.gauffin.org/2011/10/first-draft-of-my-alternative-html-helpers/
источник
using System.Web.Mvc.Html;
если вам нужно получить доступSelectExtensionsClass
((int)item).ToString()
для ,Enum.GetName(enumType, item)
чтобы получитьSelectListItem
правильно сохранен как выбран, но он по- прежнему не работает)Я нашел здесь более простое решение: http://coding-in.net/asp-net-mvc-3-method-extension/
using System; using System.Linq.Expressions; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; namespace EnumHtmlHelper.Helper { public static class EnumDropDownList { public static HtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> modelExpression, string firstElement) { var typeOfProperty = modelExpression.ReturnType; if(!typeOfProperty.IsEnum) throw new ArgumentException(string.Format("Type {0} is not an enum", typeOfProperty)); var enumValues = new SelectList(Enum.GetValues(typeOfProperty)); return htmlHelper.DropDownListFor(modelExpression, enumValues, firstElement); } } }
Одна строчка бритвой сделает это:
@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States))))
Вы также можете найти код для этого с помощью метода расширения в связанной статье.
источник
@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States)),model.State))
Начиная с ASP.NET MVC 5.1 (RC1) ,
EnumDropDownListFor
по умолчанию включен как метод расширенияHtmlHelper
.источник
Если вам нужно что-то действительно простое, есть другой способ, в зависимости от того, как вы храните состояние в базе данных.
Если бы у вас была такая сущность:
public class Address { //other address fields //this is what the state gets stored as in the db public byte StateCode { get; set; } //this maps our db field to an enum public States State { get { return (States)StateCode; } set { StateCode = (byte)value; } } }
Тогда создание раскрывающегося списка будет таким же простым:
@Html.DropDownListFor(x => x.StateCode, from State state in Enum.GetValues(typeof(States)) select new SelectListItem() { Text = state.ToString(), Value = ((int)state).ToString() } );
Разве LINQ не красив?
источник
Я смог сделать это в один лайнер.
@Html.DropDownListFor(m=>m.YourModelProperty,new SelectList(Enum.GetValues(typeof(YourEnumType))))
источник
На основе принятого ответа @jgauffin я создал свою собственную версию
EnumDropDownListFor
, которая решает проблему выбора элементов.Проблема подробно описана в другом ответе SO здесь :, и в основном сводится к неправильному пониманию поведения различных перегрузок
DropDownList
.Мой полный код (который включает перегрузки для и
htmlAttributes
т. Д.):public static class EnumDropDownListForHelper { public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression ) where TModel : class { return EnumDropDownListFor<TModel, TProperty>( htmlHelper, expression, null, null); } public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes ) where TModel : class { return EnumDropDownListFor<TModel, TProperty>( htmlHelper, expression, null, htmlAttributes); } public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes ) where TModel : class { return EnumDropDownListFor<TModel, TProperty>( htmlHelper, expression, null, htmlAttributes); } public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string optionLabel ) where TModel : class { return EnumDropDownListFor<TModel, TProperty>( htmlHelper, expression, optionLabel, null); } public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string optionLabel, IDictionary<string,object> htmlAttributes ) where TModel : class { string inputName = GetInputName(expression); return htmlHelper.DropDownList( inputName, ToSelectList(typeof(TProperty)), optionLabel, htmlAttributes); } public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string optionLabel, object htmlAttributes ) where TModel : class { string inputName = GetInputName(expression); return htmlHelper.DropDownList( inputName, ToSelectList(typeof(TProperty)), optionLabel, htmlAttributes); } private 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(); } private static SelectList ToSelectList(Type enumType) { 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 = item.ToString(), Text = title, }; items.Add(listItem); } return new SelectList(items, "Value", "Text"); } }
Я написал об этом в своем блоге здесь .
источник
Это было бы полезно для выбора целочисленного значения из перечисления: Вот
SpecType
этоint
поле ... иenmSpecType
этоenum
.@Html.DropDownList( "SpecType", YourNameSpace.SelectExtensions.ToSelectList(typeof(NREticaret.Core.Enums.enmSpecType), Model.SpecType.ToString()), "Tip Seçiniz", new { gtbfieldid = "33", @class = "small" })
источник
Я внес следующие изменения в метод SelectList, чтобы он работал у меня немного лучше. Может быть, другим будет полезно.
public static SelectList ToSelectList<T>(T selectedItem) { if (!typeof(T).IsEnum) throw new InvalidEnumArgumentException("The specified type is not an enum"); var selectedItemName = Enum.GetName(typeof (T), selectedItem); var items = new List<SelectListItem>(); foreach (var item in Enum.GetValues(typeof(T))) { var fi = typeof(T).GetField(item.ToString()); var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault(); var enumName = Enum.GetName(typeof (T), item); var title = attribute == null ? enumName : ((DescriptionAttribute)attribute).Description; var listItem = new SelectListItem { Value = enumName, Text = title, Selected = selectedItemName == enumName }; items.Add(listItem); } return new SelectList(items, "Value", "Text"); }
источник
public enum EnumStates { AL = 0, AK = 1, AZ = 2, WY = 3 } @Html.DropDownListFor(model => model.State, (from EnumStates e in Enum.GetValues(typeof(EnumStates)) select new SelectListItem { Value = ((int)e).ToString(), Text = e.ToString() }), "select", new { @style = "" }) @Html.ValidationMessageFor(model => model.State) //With select //Or @Html.DropDownListFor(model => model.State, (from EnumStates e in Enum.GetValues(typeof(EnumStates)) select new SelectListItem { Value = ((int)e).ToString(), Text = e.ToString() }), null, new { @style = "" }) @Html.ValidationMessageFor(model => model.State) //With out select
источник
То же, что и у Майка (который похоронен между длинными ответами)
model.truckimagelocation - свойство экземпляра класса перечисляемого типа TruckImageLocation
@Html.DropDownListFor(model=>model.truckimagelocation,Enum.GetNames(typeof(TruckImageLocation)).ToArray().Select(f=> new SelectListItem() {Text = f, Value = f, Selected = false}))
источник
Это наиболее общий код, который будет использоваться для всех перечислений.
public static class UtilitiesClass { public static SelectList GetEnumType(Type enumType) { var value = from e in Enum.GetNames(enumType) select new { ID = Convert.ToInt32(Enum.Parse(enumType, e, true)), Name = e }; return new SelectList(value, "ID", "Name"); } }
ViewBag.Enum= UtilitiesClass.GetEnumType(typeof (YourEnumType));
View.cshtml
@Html.DropDownList("Type", (IEnumerable<SelectListItem>)ViewBag.Enum, new { @class = "form-control"})
источник
вы можете использовать enum в своей модели
ваш Enum
public enum States() { AL,AK,AZ,...WY }
сделать модель
public class enumclass { public States statesprop {get; set;} }
ввиду
источник
Самый простой ответ в MVC5 - Define Enum:
public enum ReorderLevels { zero = 0, five = 5, ten = 10, fifteen = 15, twenty = 20, twenty_five = 25, thirty = 30 }
Привязать к просмотру:
<div class="form-group"> <label>Reorder Level</label> @Html.EnumDropDownListFor(m => m.ReorderLevel, "Choose Me", new { @class = "form-control" }) </div>
источник