Pertanyaan Menggunakan pandangan parsial dalam ASP.net MVC 4


Saya baru-baru ini mulai bermain-main dengan ASP.net MVC (4), tapi saya tidak bisa membungkus kepalaku tentang masalah yang saya miliki ini. Saya yakin itu mudah ketika Anda mengetahuinya.

Pada dasarnya saya mencoba melakukan hal berikut dalam tampilan Indeks saya:

  1. Buat daftar item saat ini dalam database bertipe "Catatan" dalam tampilan Indeks (itu mudah)
  2. Membuat item baru dalam tampilan Index yang sama (tidak semudah itu).

Jadi saya pikir saya membutuhkan pandangan parsial, dan bahwa saya telah membuat sebagai berikut (_CreateNote.cshtml):

@model QuickNotes.Models.Note
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Note</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Content)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Content)
        @Html.ValidationMessageFor(model => model.Content)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

Dalam tampilan Indeks asli saya (Index.cshtml) Saya mencoba untuk membuat tampilan parsial ini:

@model IEnumerable<QuickNotes.Models.Note>


@{
    ViewBag.Title = "Personal notes";
}

<h2>Personal notes</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Content)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Content)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
</table>

<div>
    @Html.Partial("_CreateNote")
</div>

(menggunakan: @ Html.Partial ("_ CreateNote")) Namun. Ini sepertinya tidak berfungsi, karena saya mendapatkan pesan kesalahan berikut:

Line 35: 
Line 36: <div>
Line 37:     @Html.Partial("_CreateNote");
Line 38: </div>

Source File: c:\Dropbox\Projects\workspace .NET MVC\QuickNotes\QuickNotes\Views\Notes\Index.cshtml    Line: 37 

Stack Trace: 


[InvalidOperationException: The model item passed into the dictionary is of type 'System.Data.Entity.DbSet`1[QuickNotes.Models.Note]', but this dictionary requires a model item of type 'QuickNotes.Models.Note'.]
   System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +405487

My NotesController terlihat seperti ini:

public ActionResult Index()
{

    var model = _db.Notes;

    return View(model);
}

//
// GET: /Notes/Create

public ActionResult Create()
{
    return View();
}

//
// GET: /Notes/_CreateNote - Partial view
public ViewResult _CreateNote()
{
    return View("_CreateNote");
}

Saya pikir itu ada hubungannya dengan fakta bahwa tampilan Index menggunakan model berbeda, seperti di @model IEnumerable, tapi tidak peduli bagaimana saya mengubahnya, menggunakan RenderPartial, RenderAction, mengubah ActionResult ke ViewResult dll, saya tidak bisa untuk bekerja.

Tips apa pun akan sangat dihargai! Tolong beri tahu saya jika Anda memerlukan informasi lebih lanjut. Saya dengan senang hati akan meruntuhkan seluruh proyek jika diperlukan.


75
2017-12-18 14:04


asal


Jawaban:


Ubah kode tempat Anda memuat tampilan parsial ke:

@Html.Partial("_CreateNote", new QuickNotes.Models.Note())

Ini karena tampilan parsial mengharapkan Catatan tetapi semakin melewati model tampilan induk yang merupakan IEnumerable


125
2017-12-18 14:08



Anda melewatkan model yang sama ke tampilan parsial seperti yang diteruskan ke tampilan utama, dan mereka adalah tipe yang berbeda. Modelnya adalah a DbSet dari Notes, di mana Anda harus lulus dalam satu Note.

Anda dapat melakukan ini dengan menambahkan parameter, yang saya tebak karena ini adalah bentuk buat akan menjadi baru Note

@Html.Partial("_CreateNote", new QuickNotes.Models.Note())

38
2017-12-18 14:09