1

私は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; }
}

他の選択肢?

4

1 に答える 1

1

名前がサーバーに送信されることはありません。それが<select>要素の仕組みです。選択した値のみをサーバー ( ID) に送信します。Nameしたがって、ビュー モデルを使用して、このプロパティを取り除きます。ID プロパティを null 許容整数にし、Required 属性で装飾して、ユーザーが DropDown 内の値を選択するように強制します。POST アクションで ID を取得したら、データベースにクエリを実行して、必要に応じて対応する名前を取得できます。

于 2012-12-08T15:19:42.813 に答える