Vraag Gedeeltelijke weergaven gebruiken in ASP.net MVC 4


Ik ben onlangs begonnen met spelen met ASP.net MVC (4), maar ik kan mijn hoofd niet om deze kwestie heen slaan. Ik weet zeker dat het gemakkelijk is als je het weet.

Ik probeer in essentie het volgende te doen in mijn Index-weergave:

  1. Lijst van de huidige items in de database van het type "Opmerking" in de Index-weergave (dat is eenvoudig)
  2. Nieuwe items maken in dezelfde Index-weergave (niet zo gemakkelijk).

Dus ik dacht dat ik een gedeeltelijke weergave nodig had, en die ik als volgt heb gemaakt (_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>
}

In mijn oorspronkelijke Index-weergave (Index.cshtml) probeer ik deze gedeeltelijke weergave weer te geven:

@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>

(gebruikmakend van: @ Html.Partial ("_ CreateNote")) Echter. Dit lijkt niet te werken, omdat ik het volgende foutbericht krijg:

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 ziet er zo uit:

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");
}

Ik denk dat het te maken heeft met het feit dat de Index-weergave het model anders gebruikt, zoals in @model IEnumerable, maar hoe ik het ook verander, met RenderPartial, RenderAction, veranderend ActionResult in ViewResult enz., Kan ik niet krijgen het werkt.

Alle tips worden zeer op prijs gesteld! Laat het me weten als je meer informatie nodig hebt. Ik zou het hele project graag doornemen indien nodig.


75
2017-12-18 14:04


oorsprong


antwoorden:


Wijzig de code waar u de gedeeltelijke weergave laadt naar:

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

Dit komt omdat de gedeeltelijke weergave een opmerking verwacht, maar het model van de bovenliggende weergave die IEnumerabel is, wordt doorgegeven


125
2017-12-18 14:08



U geeft hetzelfde model door aan de gedeeltelijke weergave als wordt doorgegeven aan de hoofdweergave en het zijn verschillende typen. Het model is een DbSet van Notes, waar je in een single moet slagen Note.

U kunt dit doen door een parameter toe te voegen, die ik vermoed omdat het het aanmaakformulier een nieuw is Note

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

38
2017-12-18 14:09