我来晚了吗?
改变枚举类型的值并不是很令人满意。
将模型属性更改为可为空,然后添加 [Required] 属性以防止其为空也不是很令人满意。
我建议使用 ViewBag 来设置下拉列表的默认选定值。
控制器第 4 行是唯一重要的一行。
编辑:啊...新手...我的第一个想法是使用 ModelState.SetModelValue,因为我的新手本能阻止我简单地尝试在 ViewBag 中设置所需的值,因为下拉列表绑定到模型。我确信会有问题:它会绑定到模型的属性,而不是 ViewBag 的属性。我错了:ViewBag 是可以的。我已经纠正了代码。
这里是一个例子。
模型:
namespace WebApplication1.Models {
public enum GoodMusic {
Metal,
HeavyMetal,
PowerMetal,
BlackMetal,
ThashMetal,
DeathMetal
}
public class Fan {
[Required(ErrorMessage = "Don't be shy!")]
public String Name { get; set; }
[Required(ErrorMessage = "There's enough good music here for you to chose!")]
public GoodMusic FavouriteMusic { get; set; }
}
}
控制器:
namespace WebApplication1.Controllers {
public class FanController : Controller {
public ActionResult Index() {
ViewBag.FavouriteMusic = string.Empty;
return View( "Index" );
}
[HttpPost, ActionName( "Index" )]
public ActionResult Register( Models.Fan newFan ) {
if( !ModelState.IsValid )
return View( "Index" );
ModelState.Clear();
ViewBag.Message = "OK - You may register another fan";
return Index();
}
}
}
视图:
@model WebApplication1.Models.Fan
<h2>Hello, fan</h2>
@using( Html.BeginForm() ) {
<p>@Html.LabelFor( m => m.Name )</p>
<p>@Html.EditorFor( m => m.Name ) @Html.ValidationMessageFor( m => m.Name )</p>
<p>@Html.LabelFor( m => m.FavouriteMusic )</p>
<p>@Html.EnumDropDownListFor( m => m.FavouriteMusic, "Chose your favorite music from here..." ) @Html.ValidationMessageFor( m => m.FavouriteMusic )</p>
<input type="submit" value="Register" />
@ViewBag.Message
}
如果在模型Index操作中没有"ModelState.SetModelValue或ViewBag.FavouriteMusic = string.Empty"行,则默认选择的值将是"Metal"而不是"Select your music..."
选择许可证
添加为枚举值之一,其 ID 为 0。我希望能够在用户未从枚举中选择任何一个值时显示错误消息。 - Cybercop