web-dev-qa-db-fra.com

Utilisation de vues partielles dans ASP.net MVC 4

J'ai récemment commencé à jouer avec ASP.net MVC (4), mais je ne peux pas comprendre ce problème que je rencontre. Je suis sûr que c'est facile quand vous le savez.

J'essaie essentiellement de procéder comme suit dans ma vue Index:

  1. Lister les éléments actuels dans la base de données de type "Note" dans la vue Index (c'est facile)
  2. Créer de nouveaux éléments dans la même vue d'index (pas si facile).

J'ai donc pensé qu'il me fallait une vue partielle et que j'ai créé comme suit (_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>
}

Dans ma vue d'index d'origine (Index.cshtml), j'essaie de rendre cette vue partielle:

@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")) Cependant. Cela ne semble pas fonctionner car je reçois le message d'erreur suivant:

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

Mon NotesController ressemble à ceci:

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

Je pense que cela a à voir avec le fait que la vue Index utilise le modèle différemment, comme dans @model IEnumerable, mais peu importe la façon dont je le modifie, en utilisant RenderPartial, RenderAction, en modifiant ActionResult en ViewResult, etc. ça marche.

Tous les conseils seraient grandement appréciés! S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations. Je serais heureux de compresser tout le projet si nécessaire.

77
Espen S.

Modifiez le code où vous chargez la vue partielle en:

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

Cela est dû au fait que la vue partielle attend une note mais que le modèle de la vue parent, qui est le IEnumerable, est transmis.

128
Richard Dalton

Vous transmettez à la vue partielle le même modèle que celui qui est transmis à la vue principale, et ils sont de types différents. Le modèle est une DbSet sur Notes, où vous devez transmettre un seul Note.

Vous pouvez le faire en ajoutant un paramètre, ce qui, je suppose, est que le formulaire de création serait un nouveau Note

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