2016-05-16 3 views
0

私は、編集モードでフォーム上にいくつかのListBoxFor要素を持っています。フィールドに記録されたデータがある場合、フォームが開くと、前に選択した項目が正しく表示されます。項目が空の場合、itemsパラメータはnullにできないため、エラーがスローされます。ビューでチェックする方法がありますか、4つのパラメータでListBoxForを使用するデータがある場合、選択された項目を省略して3つのパラメータだけを使用しない場合は、ListBoxFor selectedValuesがビューに表示される前にnullであることを確認しますか?

これは私がListBoxForを宣言しています方法です:

@Html.ListBoxFor(model => model.IfQualityPoor, new MultiSelectList(ViewBag.IfPoor, "Value", "Text", ViewBag.IfQualityPoorSelected), new { @class = "chosen", multiple = "multiple" }) 

私は、コントローラは、そのモデルに結合するための文字列を結合や分割など、選択した項目を保持しているICollectionを渡すためにViewBagを使用していますフィールド。 MultiSelectListsは常に私には問題があると証明しています。

答えて

1

あなたの質問は完全ではありませんが、あなた自身が難しくなっています。ListBoxForを使用する必要があります。 DropDownListForまたはListBoxForのいずれかが必要なのはIEnumerable<SelectListItem>です。 RazorはModelStateに基づいて適切な値を選択します。

ので、ViewBag.IfPoorIEnumerable<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との対話に投稿すると、あなたが保存したときに正しい文字列が自動的にデータベースに設定されます。

+0

ありがとう、クリス。私は選択した値のコレクションを1つのコンマ区切りの文字列に結合し、その値をIfQualityPoorの値としてデータベースに戻さなければならなかったので、そのようにしていました。私は今あなたの方法でそれを試してみます。 – user3632714

+0

あなたの最初のオプションを試してみて、それは私に "複数の選択が許可されているときにIEnumerableに評価されなければならないパラメータの式"を与えます。エラー。 – user3632714

+0

つまり、 'IfQualityPoor'は列挙型ではありません。複数選択を行っている場合は、複数の投稿値を受け入れる必要があるため、投稿するプロパティはリストタイプでなければなりません。繰り返しますが、文字列のようなものを実際に保持する必要がある場合でも、リストに投稿する必要がありますが、上記の更新で追加したコードを使用して永続性のために文字列に自動的にマッピングされます。 –

関連する問題