Las*_*Bye 0 asp.net-mvc enums type-conversion model-binding
如何将枚举绑定到MVC中的下拉列表以使模型在发布后有效?不确定是否需要转换器或其他东西,我提供代码,您推荐的解决方案是什么? (以下代码导致ModelError)
枚举:
public enum TimePlan
{ Routine = 0,
Single = 1 }
Run Code Online (Sandbox Code Playgroud)
该模型 :
public TimePlan TheTimePlan { get; set; }
public SelectListItem[] TimeList { get; set; }
Run Code Online (Sandbox Code Playgroud)
控制器:
[HttpPost]
public virtual ActionResult Education(EducationViewModel EducationModelInfo)
{
if (ModelState.IsValid)
{ ...
} }
Run Code Online (Sandbox Code Playgroud)
视图绑定:
@Html.DropDownListFor(m => m.CourseTimePlan, Model.TimeList, "Please select the time plan")
Run Code Online (Sandbox Code Playgroud)
您尚未显示如何填充此TimeList集合.尝试这样,它应该工作:
public TimePlan TheTimePlan { get; set; }
public IEnumerable<SelectListItem> TimeList
{
get
{
var enumType = typeof(TimePlan);
var values = Enum.GetValues(enumType).Cast<TimePlan>();
var converter = TypeDescriptor.GetConverter(enumType);
return
from value in values
select new SelectListItem
{
Text = converter.ConvertToString(value),
Value = value.ToString(),
};
}
}
Run Code Online (Sandbox Code Playgroud)
或者为了使它更通用,你可以编写一个可重用的帮助器:
public static IHtmlString DropDownListForEnum<TModel, TEnum>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TEnum>> expression
)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var enumType = GetNonNullableModelType(metadata);
var values = Enum.GetValues(enumType).Cast<TEnum>();
var converter = TypeDescriptor.GetConverter(enumType);
var items =
from value in values
select new SelectListItem
{
Text = converter.ConvertToString(value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
};
return htmlHelper.DropDownListFor(expression, items);
}
Run Code Online (Sandbox Code Playgroud)
然后你的模型只能包含Enum值:
public TimePlan TheTimePlan { get; set; }
Run Code Online (Sandbox Code Playgroud)
并在您的视图中使用帮助器:
@Html.DropDownListForEnum(x => x.TheTimePlan)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5744 次 |
| 最近记录: |