Frage Teilansichten in ASP.net MVC 4 verwenden


Ich habe kürzlich angefangen, mit ASP.net MVC (4) herumzuspielen, aber ich kann mich nicht mit diesem einen Problem herumschlagen, das ich habe. Ich bin sicher, es ist einfach, wenn du es weißt.

Ich versuche im Wesentlichen Folgendes in meiner Indexansicht zu tun:

  1. Listen Sie die aktuellen Artikel in der Datenbank vom Typ "Notiz" in der Indexansicht auf (das ist einfach)
  2. Erstellen neuer Artikel in der gleichen Indexansicht (nicht so einfach).

Also dachte ich mir, dass ich eine Teilansicht benötige, die ich wie folgt erstellt habe (_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 meiner ursprünglichen Indexansicht (Index.cshtml) versuche ich diese Teilansicht zu rendern:

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

(mit: @ Html.Partial ("_ CreateNote")) Jedoch. Dies scheint nicht zu funktionieren, da ich folgende Fehlermeldung erhalte:

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

Mein NotesController sieht so aus:

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

Ich denke, es hat damit zu tun, dass die Indexansicht das Modell anders verwendet, als in @model IEnumerable, aber egal wie ich es ändere, mit RenderPartial, RenderAction, ActionResult zu ViewResult ändern, kann ich nicht bekommen es funktioniert.

Irgendwelche Tipps würden sehr geschätzt werden! Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Ich würde mich freuen, wenn nötig das gesamte Projekt herunter zu laden.


75
2017-12-18 14:04


Ursprung


Antworten:


Ändern Sie den Code, in dem Sie die Teilansicht laden, zu:

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

Dies liegt daran, dass die Teilansicht eine Notiz erwartet, aber das Modell der Elternansicht, das IEnumerable ist, erhalten wird


125
2017-12-18 14:08



Sie übergeben dasselbe Modell an die Teilansicht, wie es an die Hauptansicht übergeben wird, und sie sind unterschiedliche Typen. Das Modell ist a DbSet von Notes, wo du eine Single einsenden musst Note.

Sie können dies tun, indem Sie einen Parameter hinzufügen, was ich vermute, da es sich bei der Create Form um eine neue handelt Note

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

38
2017-12-18 14:09