MVC3 Razor DropDownListFor 열거 형
내 프로젝트를 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>
조언에 미리 감사드립니다!
내 프로젝트를 위해 방금 만들었습니다. 아래 코드는 내 도우미 클래스의 일부이며 필요한 모든 메서드를 얻었 으면합니다. 작동하지 않는 경우 댓글을 작성하고 다시 확인하겠습니다.
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를 변경하는 것입니다 views\web.config
.
그들과 함께 당신은 할 수 있습니다 :
@Html2.DropDownFor(m => m.YourEnum);
@Html2.CheckboxesFor(m => m.YourEnum);
@Html2.RadioButtonsFor(m => m.YourEnum);
자세한 정보 : http://blog.gauffin.org/2011/10/first-draft-of-my-alternative-html-helpers/
여기에 대한 더 간단한 해결책을 찾았습니다. 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))))
링크 된 문서에서 확장 메서드를 사용하여 수행하는 코드를 찾을 수도 있습니다.
현재 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 답변에 자세히 설명되어 있으며 기본적으로 .NET의 다양한 과부하 동작에 대한 오해로 인해 발생 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");
}
}
여기 내 블로그 에이 글을 올렸습니다 .
이것은 enum에서 int 값을 선택하는 데 도움이 될 것입니다. Here SpecType
is an int
field ... and enmSpecType
is an 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
Same as Mike's (which is buried between lengthy responses)
model.truckimagelocation is class instance property of the TruckImageLocation enumeration type
@Html.DropDownListFor(model=>model.truckimagelocation,Enum.GetNames(typeof(TruckImageLocation)).ToArray().Select(f=> new SelectListItem() {Text = f, Value = f, Selected = false}))
you can use enum in your model
your Enum
public enum States()
{
AL,AK,AZ,...WY
}
make a model
public class enumclass
{
public States statesprop {get; set;}
}
in view
@Html.Dropdownlistfor(a=>a.statesprop)
The easiest answer in MVC5 is Define Enum:
public enum ReorderLevels {
zero = 0,
five = 5,
ten = 10,
fifteen = 15,
twenty = 20,
twenty_five = 25,
thirty = 30
}
Bind In View:
<div class="form-group">
<label>Reorder Level</label>
@Html.EnumDropDownListFor(m => m.ReorderLevel, "Choose Me", new { @class = "form-control" })
</div>
This is most generic code which will be used for all Enums.
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");
}
}
Action Method
ViewBag.Enum= UtilitiesClass.GetEnumType(typeof (YourEnumType));
View.cshtml
@Html.DropDownList("Type", (IEnumerable<SelectListItem>)ViewBag.Enum, new { @class = "form-control"})
참고URL : https://stackoverflow.com/questions/4656758/mvc3-razor-dropdownlistfor-enums
'developer tip' 카테고리의 다른 글
Laravel Eloquent ORM 거래 (0) | 2020.09.17 |
---|---|
x + =가 x = x + a보다 빠릅니까? (0) | 2020.09.17 |
Android : 클릭시 임의의 색상 생성? (0) | 2020.09.17 |
C ++에서 숫자가 2의 거듭 제곱인지 테스트하는 가장 간단한 방법은 무엇입니까? (0) | 2020.09.17 |
루프없이 레코드를 유지하면서 배열에서 빈 문자열을 제거 하시겠습니까? (0) | 2020.09.17 |