5

私は次のモデルを持っています:

public class Filter
{
    public string Field { get; set; }

    public string Operator { get; set; }

    public string Value { get; set; }
}

そして、次のコントローラー:

public class FilterController
{
    public ActionResult Index()
    {
        IList<Filter> model = new List<Filter>() {
            new Filter(), 
            new Filter()
        };

        return View(model);
    }
}

そして、次のビュー:

@model IEnumerable<Filter>
@Html.EditorForModel()

これにより、EditorTemplateが検索さFilter.cshtmlれ、リスト内の各要素のテンプレートがレンダリングされます。

IEnumerable`1.cshtmlGlimpseを使用すると、MVCが代わりにを探していることに気付きましたFilter.cshtml

私が使うときも同じことが起こります

@Html.EditorFor(model => model)

私がこれをするとき:

@Html.EditorFor(model => model, "Filter")

Filter.cshtmlタイプのモデルを期待しているというエラーが表示されますが、タイプFilterのモデルを受け取りましたIEnumerable<Filter>

私はこれを正しく行っていますか?正しいエディターテンプレートを使用して、モデルのリストを正しくレンダリングするために他に何かする必要がありますか?

4

2 に答える 2

3

私は過去にEditorTemplatesで間違いなく問題を抱えていましたが、それは主にユーザーエラーだったと思います。

考えられる回避策の1つは、コレクションを単一のビューモデルクラスにカプセル化し、それをビューに渡すことです。

public class MySweetFilterViewModel
{
    public IEnumerable<Filter> Filters { get; set; }
}

次に、単一のビューを使用してコレクションを選択できます

@model Project.Models.MySweetFilterViewModel
@Html.EditorFor(x => x.Filters)

コントローラがカプセル化されていることを確認してください

public ActionResult Index()
{
    //...
    return View(new MySweetFilterViewModel() { Filters = model });
}
于 2012-04-19T20:16:37.387 に答える
1

理由に関するあなたの質問に答えるために...いくつかのことを試してみましょう。

このようにコードを書いた場合はどうなりますか?

return View(new List<Filter>{ new Filter(), new Filter() });

リストではなく中間のIListを使用しているため、何かが混乱している可能性があります。(私の理論では)何が起こるかというと、anを渡すと、ビューに渡されるのではなくIList<Filter>、標準が発生するということです。IEnumerableIEnumerable<Filter>

あなたも試すことができますmodel.AsEnumerable<Filter>()

于 2012-04-19T20:54:02.053 に答える