0

私のドメインオブジェクトStoreは、オブジェクトへの参照を保持していますChain:

public class Store
{
    public Chain Chain { get; set; }
}

新しいストアを作成すると、関連付けられたチェーンを設定する可能性があります。ViewBag を介してチェーン オブジェクトを渡し、Html.DropDownListFor選択に使用することでこれを実現しています。

@Html.DropDownListFor(
    x => x.Chain,
    new SelectList(ViewBag.Chains, "Id", "Name"))

ここまでは問題ありませんが、(送信後) コントローラーに戻ると、chain プロパティは null です。DropDownList を設定できると考えましたChain.Idが、エンティティを再度ロードする必要があります。正しい参照を取得/保持するためのより良い方法はありますか?

4

1 に答える 1

2

正しい参照を取得/保持するためのより良い方法はありますか?

いいえ、それが HTML のしくみです。選択した値のみがサーバーに送信され、この値を使用して対応するエンティティをロードする必要があります。ASP.NET MVC 開発に入る前に、HTML を学習してください。とても助かります。それが正しい方法です:

@Html.DropDownListFor(
    x => x.Chain.Id,
    new SelectList(ViewBag.Chains, "Id", "Name")
)

ViewBag実のところ、正直に言うと、これを処理する最も正しい方法は、すべてのがらくたを取り除き、アプリケーションで実際のビュー モデルを使用することです。

@Html.DropDownListFor(
    x => x.ChainId,
    Model.AvailableChains
)

whereAvailableChainsはもちろんIEnumerable<SelectListItem>、このビュー用に準備したビュー モデルの型のプロパティになります。ASP.NET MVC を正しい方法で実行したい場合は、常にビュー モデルを使用し、ドメイン モデルをビューに渡さないようにする必要があります。

ビューモデルは次のようになります。

public class MyViewModel
{
    public int ChainId { get; set; }
    public IEnumerable<SelectListItem> AvailableChains { get; set; }
}
于 2013-02-17T22:40:40.727 に答える