8

に変更する"model => model.id"と、"model => model.Supplierid"以下のエラーが発生します

「複数選択が許可されている場合、パラメータ 'expression' は IEnumerable に評価される必要があります。」

以下のコードを見てください

// これは私のモデル クラス

public class clslistbox{
public int id { get; set; }
public int Supplierid { get; set; }
public List<SuppDocuments> lstDocImgs { get; set; }

public class SuppDocuments
{
    public string Title { get; set; }
    public int documentid { get; set; }
}
public List<SuppDocuments> listDocImages()
{
    List<SuppDocuments> _lst = new List<SuppDocuments>();
    SuppDocuments _supp = new SuppDocuments();
    _supp.Title = "title";
    _supp.documentid = 1;
    _lst.Add(_supp);
    return _lst;
} 
}

// これは私のコントローラー

    [HttpGet]
    public ActionResult AddEditSupplier(int id)
    {

        clslistbox _lst = new clslistbox();
        _lst.lstDocImgs= _lst.listDocImages();
        return View(_lst);
    }

// これは listboxfor をバインドしているビューです

@model clslistbox
@using (Html.BeginForm("AddEditSupplier", "Admin", FormMethod.Post))
{
    @Html.ListBoxFor(model => model.id, new SelectList(Model.lstDocImgs, "documentid", "title"))
}

誰でもその理由を見ることができますか?

4

2 に答える 2

19

ここでの式のプロパティの変更は厄介だと思います-どちらの場合も機能しません。

アップデート

ただし、最初のラウンドでエラーが発生しなかった理由について、おそらく不必要に詳細な説明については、私の回答の最後を参照してください。

更新終了

ユーザーに複数選択機能を提供するために使用されていますが、複数選択をサポートできないプロパティListBoxForにバインドしようとしています。int( IEnumerable<T>MVC でデフォルトでリスト ボックスをバインドできるようにするには、少なくとも が必要です)

使用するつもりだと思いますDropDownListFor-つまり、1つだけを選択できるアイテムのリストを表示しますか?

リストボックスで単一選択セマンティクスを実際に探している場合、MVC で行うのは難しいです。Html ヘルパーは、複数選択用のリストボックスを完全に対象としているためです。SO の他の誰かが、ドロップダウンをリスト ボックスのように見せる方法について質問をしました。.

または、そのようなリストボックスの HTML を自分で生成することもできます。

(更新) - 潜在的に不必要に詳細な解説 (!)

最初のラウンドで例外が発生しない理由は、おそらく、HTML が生成されたときにidinの値がなかったためです。関心ModelStateのある反映された MVC ソース (から) は次のとおりです (最後の呼び出しは例外のソースです)。SelectExtensions.SelectInternalGetSelectListWithDefaultValue

object obj = 
  allowMultiple ? htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string[])) : 
    htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string));
if (!flag && obj == null && !string.IsNullOrEmpty(name))
{
  obj = htmlHelper.ViewData.Eval(name);
}
if (obj != null)
{
  selectList = 
    SelectExtensions.GetSelectListWithDefaultValue(selectList, obj, allowMultiple);
}

を呼び出したので、最初に制御変数allowMultipleが true であることに注意してくださいListBoxForselectListは、SelectList作成して 2 番目のパラメーターとして渡します。MVC が (残念ながら場合によっては) 行うことの 1 つはModelState、ビューを再表示するときに渡す選択リストを変更して、ビューが表示ModelStateされたときに POST を介して設定された値が再選択されるようにすることです。リロードされます (これは、値を から基になるモデルにコピーしないため、ページの検証が失敗した場合に役立ちますModelStateが、ページにはそれらの値が選択されているものとして表示されます)。

したがって、最初の行でわかるように、渡した式/フィールドのモデルの現在の値は、モデルの状態から釣り出されます。文字列配列または文字列として。それが失敗した ( を返すnull) 場合は、モデル値を取得するために別の式 (または同様の) を実行します。そこから null 以外の値を取得すると、 が呼び出されますSelectExtensions.GetSelectListWithDefaultValue

私が言うように - あなたがやろうとしていることは、最終的に または の場合には機能しません(それらIdSupplierIdである必要があるため) IEnumerable。「調整済み」はスキップされるため、例外は発生しません。を使用する場合、同じことは当てはまりません。その時点で に値があるか、が整数値を正常に取得することに賭けるからです。ModelStateEvalIdSelectListSupplierIdModelStateViewData.Eval

例外をスローしないことは、動作することと同じではありません!.

更新終了

于 2013-01-11T10:12:38.303 に答える