Я бы использовал перечислимое значение NULL и атрибут Required в модели представления:
public class MyViewModel
{
[Required]
public ColorsEnum? PreferedColor { get; set; }
}
Таким образом, вы можете удалить значение Undefined
из определения перечисления:
public enum ColorsEnum
{
Blue,
Red,
Green
}
, а затем немного измените ваш помощник:
public static class HtmlExtensions
{
public static IHtmlString DropDownListForEnum<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var enumType = Nullable.GetUnderlyingType(metaData.ModelType);
if (enumType == null || !enumType.IsEnum)
{
throw new ApplicationException(
"The DropDownListForEnum helper function must be used with a nullable enum property"
);
}
var names = Enum.GetNames(enumType);
var translatedNames = GetTranslatedNames(metaData.ModelType);
var query =
from p in names
select new SelectListItem
{
Text = translatedNames.ContainsKey(p) ? translatedNames[p] : p,
Value = p,
Selected = false
};
return htmlHelper.DropDownList(
metaData.PropertyName,
query.ToList(),
"-- Select a color --"
);
}
}
, а затем просто протестируйте контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
и соответствующий вид:
@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.PreferedColor)
@Html.DropDownListForEnum(m => m.PreferedColor)
<input type="submit" />
}