Хорошо, ребята. Я искал несколько способов сделать это, потому что устал от написания глупой работы, чтобы обойти этот недостаток в среде .Net. Основываясь на нескольких потоках, я составил следующее решение.
Отказ от ответственности, это не полностью автоматизированное решение, поэтому оно не будет работать для всех. Учитывая мою реализацию, это работает. Может быть, мой путь поможет кому-то спроектировать что-то, что будет работать для них.
Сначала я создал репозиторий enum. Перечисления не должны находиться здесь, но они должны быть видны из хранилища.
В репозитории я создал класс и открытое статическое свойство для предоставления списка типов перечислений.
namespace MyApp.Enums
{
public enum ATS_Tabs { TabOne = 0, TabTwo = 1, TabThree = 2, TabFour = 3, TabFive = 4 };
public class ModelEnums
{
public static IEnumerable<Type> Types
{
get
{
List<Type> Types = new List<Type>();
Types.Add(typeof(ATS_Tabs));
return Types;
}
}
}
}
Затем я создал связыватель модели и реализовал интерфейс IModelBinder (см. Комментарий и ссылку kdawg).
namespace MyApp.CustomModelBinders
{
public class EnumModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try
{
return Enum.ToObject(Type.GetType(bindingContext.ModelType.AssemblyQualifiedName), Convert.ToInt32(valueResult.AttemptedValue));
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
}
Это может помочь добавить некоторый код, чтобы гарантировать, что преобразование valueResult.AttemptedValue не завершится ошибкой.
Затем я просмотрел список типов перечислений, которые я создал выше, и добавил для них привязки моделей (... в Global.asax.cs).
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
foreach (Type type in ModelEnums.Types)
{
ModelBinders.Binders.Add(type, new EnumModelBinder());
}
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Признаюсь, это не самый интуитивно понятный способ, но он прекрасно работает для меня. Не стесняйтесь, дайте мне знать, если я могу оптимизировать это.