Verwenden von Teilansichten in ASP.net MVC 4

77

Ich habe vor kurzem angefangen, mit ASP.net MVC (4) herumzuspielen, aber ich kann mich nicht um dieses eine Problem kümmern, das ich habe. Ich bin sicher, es ist einfach, wenn Sie es wissen.

Im Wesentlichen versuche ich in meiner Indexansicht Folgendes zu tun:

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

Also dachte ich, ich brauche eine Teilansicht, 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>

(using: @ Html.Partial ("_ CreateNote")) Allerdings. Dies scheint nicht zu funktionieren, da die folgende Fehlermeldung angezeigt wird:

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 folgendermaßen 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, wie in @model IEnumerable, aber egal wie ich es ändere, mit RenderPartial, RenderAction, ActionResult in ViewResult usw. kann ich nicht bekommen es zu arbeiten.

Irgendwelche Tipps wären sehr dankbar! Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Bei Bedarf würde ich gerne das gesamte Projekt komprimieren.

Espen S.
quelle

Antworten:

129

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

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

Dies liegt daran, dass die Teilansicht eine Notiz erwartet, aber das Modell der übergeordneten Ansicht, die IEnumerable, übergeben wird

Richard Dalton
quelle
5
Du hast Recht! Danke vielmals! Ich habe es tatsächlich ein paar Mal fast gleich versucht, aber ich dachte nicht, dass ich die "neue" Aussage brauchte. Dumm von mir :(
Espen S.
38

Sie übergeben das gleiche Modell an die Teilansicht, das an die Hauptansicht übergeben wird, und es handelt sich um verschiedene Typen. Das Modell ist ein DbSetvon Notes, bei dem Sie ein einzelnes übergeben müssen Note.

Sie können dies tun, indem Sie einen Parameter hinzufügen, der vermutlich ein neues Formular ist Note

@Html.Partial("_CreateNote", new QuickNotes.Models.Note())
harriyott
quelle
Ja, richtig! Scheint, als hätte ich einige MVC-Grundlagen übersehen. Vielen Dank!
Espen S.