私はasp.netmvc4で開発する初心者ですが、モデルの1つを編集すると、ModelState.IsValidが常にfalseを返します。私のモデルは次です:
public class ShowTime
{
public int ID { get; set; }
[Display(Name = "Date")]
[Required(ErrorMessage = "Date is required")]
public DateTime Date { get; set; }
[Display(Name = "Time")]
[Required(ErrorMessage = "Time is required")]
public DateTime DateTime { get; set; }
public virtual Place Place { get; set; }
}
public class Place
{
public int ID { get; set; }
[Display(Name = "Place name")]
[Required(ErrorMessage = "Place name is required")]
public string Name { get; set; }
public virtual Address Address { get; set; }
}
次に、ShowTimesを編集するための次のフォームがあります。
<fieldset class="formulari">
<p>
@Html.LabelFor(model => model.Date)
@Html.EditorFor(model => model.Date)
@Html.ValidationMessageFor(model => model.Date)
</p>
<p>
@Html.LabelFor(model => model.DateTime)
@Html.EditorFor(model => model.DateTime)
@Html.ValidationMessageFor(model => model.DateTime)
</p>
<p>
<label>Escenari</label>
@Html.DropDownListFor(model => model.Place.ID, new SelectList(new PlaceBLL().GetAll(), "ID", "Name"))
</p>
<p>
@Html.LabelFor(model => model.Ticket.Price)
@Html.EditorFor(model => model.Ticket.Price, "Ticket", new ViewDataDictionary(Html.ViewDataContainer.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Ticket" } })
@Html.ValidationMessageFor(model => model.Ticket.Price)
</p>
<p>
@Html.LabelFor(model => model.Ticket.BuyingTicketURL)
@Html.EditorFor(model => model.Ticket.BuyingTicketURL)
@Html.ValidationMessageFor(model => model.Ticket.BuyingTicketURL)
</p>
@Html.HiddenFor(model => model.ID)
@Html.HiddenFor(model => model.Ticket.ID)
<br />
<input type="submit" value="Save" />
</fieldset>
ここでの問題はPlaceオブジェクトにあります。ユーザーはドロップドローンリストからShowTimeの場所を選択し、ユーザーが保存ボタンをクリックするとモデルが返され、ModelState.IsValidはfalseを返します。これは、モデルのShowTimeのPlaceオブジェクトがDropDownListから値を取得し、IDプロパティのみが入力されているためです。 (場所のNameプロパティが必須であることを思い出してください)、PlaceのプロパティNameが空であるため、ModelStateの検証に失敗します。
ドロップダウンリストからプレイスオブジェクトを取得していて、プレイスオブジェクトがそのすべてのプロパティで埋められていない場合、モデルを有効にするにはどうすればよいですか?その場合、データベースモデルをビューに正確にマッピングするのは間違っていると思います。このようなViewModelを作成し、サーバーコードでモデルをShowTimeに変換することで、より良い解決策を実行できます。
public class ShowTimeViewModel
{
public int ID { get; set; }
[Display(Name = "Date")]
[Required(ErrorMessage = "Date is required")]
public DateTime Date { get; set; }
[Display(Name = "Time")]
[Required(ErrorMessage = "Time is required")]
public DateTime DateTime { get; set; }
public int PlaceID { get; set; }
public Ticket Ticket { get; set; }
}
他の選択肢?