Pertanyaan MVC3 IEnumerable model tidak menemukan template editor yang benar


Saya memiliki model berikut:

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

    public string Operator { get; set; }

    public string Value { get; set; }
}

Dan pengontrol berikut:

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

        return View(model);
    }
}

Dan tampilan berikut:

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

Ini harus mencari EditorTemplate saya Filter.cshtml, dan render template untuk setiap elemen dalam daftar, kan?

Menggunakan Glimpse, saya melihat bahwa MVC sedang mencari IEnumerable`1.cshtml dari pada Filter.cshtml

Hal yang sama terjadi ketika saya menggunakan

@Html.EditorFor(model => model)

Ketika saya melakukan ini:

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

Saya mendapatkan kesalahan mengatakan itu Filter.cshtml mengharapkan model tipe Filter tetapi menerima model tipe IEnumerable<Filter>

Apakah saya melakukan ini dengan benar? Apakah saya perlu melakukan hal lain untuk mendapatkan daftar model yang dirender dengan benar, menggunakan template editor yang benar?


5
2018-04-19 18:18


asal


Jawaban:


Saya sudah pasti memiliki masalah di masa lalu dengan EditorTemplates, tapi saya pikir itu sebagian besar kesalahan pengguna.

Salah satu solusi yang mungkin adalah merangkum koleksi Anda dalam satu, melihat kelas model dan menyampaikannya ke tampilan

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

Kemudian Anda dapat menggunakan satu tampilan untuk memisahkan koleksi

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

Pastikan saja pengontrol Anda mengenkapsulasi

public ActionResult Index()
{
    //...
    return View(new MySweetFilterViewModel() { Filters = model });
}

3
2018-04-19 20:16



Untuk menjawab pertanyaan Anda tentang mengapa ... mari bereksperimen dengan beberapa hal.

Apa yang terjadi jika Anda menulis kode Anda seperti ini:

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

Bisa jadi karena Anda menggunakan IList menengah daripada Daftar, ada sesuatu yang membingungkan. Apa yang akan terjadi (dalam teori saya) adalah bahwa melewati suatu IList<Filter> menyebabkan standar IEnumerable bukan sebuah IEnumerable<Filter> untuk diteruskan ke tampilan.

Anda juga bisa mencoba model.AsEnumerable<Filter>()


1
2018-04-19 20:54