私は少し遅れていますか?
列挙型の値を変更しても、満足できるものではありません。
モデル プロパティを変更して null 可能にすることも、 [Required] 属性を追加して null 可能にならないようにすることもありません。
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;
//ModelState.SetModelValue( "FavouriteMusic", new ValueProviderResult( string.Empty, string.Empty, System.Globalization.CultureInfo.InvariantCulture ) );
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」行がないと、デフォルトで選択される値は「Select your music...」ではなく「Metal」になります。