あなたの質問は完全ではありませんが、あなた自身が難しくなっています。ListBoxFor
を使用する必要があります。 DropDownListFor
またはListBoxFor
のいずれかが必要なのはIEnumerable<SelectListItem>
です。 RazorはModelState
に基づいて適切な値を選択します。
ので、ViewBag.IfPoor
がIEnumerable<SelectListItem>
であると仮定すると、あなたはあなたのビューで必要なのは、次のとおりです。
@Html.ListBoxFor(m => m.IfQualityPoor, (IEnumerable<SelectListItem>)ViewBag.IfPoor, new { @class = "chosen" })
、彼らがあるべきな正しいオプションは、お使いのモデルのIfQualityPoor
の値に基づいてselected
としてマークされます。また、DropDownListFor
ではなくListBoxFor
を使用することで、htmlAttributes
パラメータにmultiple = "multiple"
を渡す必要はありません。
ビューモデルを使用してオプションをプロパティとして追加するとさらに優れています。次に、ビューでのキャストについて心配する必要はありません。これは、実行時の例外を導入するための良い方法です。例:次に
public class FooViewModel
{
...
public IEnumerable<SelectListItem> IfQualityPoorOptions { get; set; }
}
、あなたが(代わりにViewBag
を設定する)ビューを返す前に、あなたのアクションでこれを設定します。最後に、あなたの見解では:
@Html.ListBoxFor(m => m.IfQualityPoor, Model.IfQualityPoorOptions, new { @class = "chosen" })
これよりずっと単純で、あなたはそれほど問題になることはありません。
UPDATE
データベースストレージのための文字列にリストを平坦化処理するための最良の方法は、そのための特別なプロパティを使用し、その後、カスタムゲッターとセッターは、へ/からマップすることです(コメントに基づきます) 。たとえば:
public string IfQualityPoor
{
get { return IfQualityPoorList != null ? String.Join(",", IfQualityPoorList) : null; }
set { IfQualityPoorList = !String.IsNullOrWhiteSpace(value) ? value.Split(',').ToList() : null; }
}
[NotMapped]
public List<string> IfQualityPoorList { get; set; }
はその後、あなたは/ IfQualityPoorList
との対話に投稿すると、あなたが保存したときに正しい文字列が自動的にデータベースに設定されます。
ありがとう、クリス。私は選択した値のコレクションを1つのコンマ区切りの文字列に結合し、その値をIfQualityPoorの値としてデータベースに戻さなければならなかったので、そのようにしていました。私は今あなたの方法でそれを試してみます。 – user3632714
あなたの最初のオプションを試してみて、それは私に "複数の選択が許可されているときにIEnumerableに評価されなければならないパラメータの式"を与えます。エラー。 – user3632714
つまり、 'IfQualityPoor'は列挙型ではありません。複数選択を行っている場合は、複数の投稿値を受け入れる必要があるため、投稿するプロパティはリストタイプでなければなりません。繰り返しますが、文字列のようなものを実際に保持する必要がある場合でも、リストに投稿する必要がありますが、上記の更新で追加したコードを使用して永続性のために文字列に自動的にマッピングされます。 –