77 votes

Utilisation de vues partielles en ASP.net MVC 4

J'ai récemment commencé à jouer avec ASP.net MVC (4), mais je n'arrive pas à comprendre le problème que je rencontre. Je suis sûr que c'est facile quand on le connaît.

J'essaie essentiellement de faire ce qui suit dans ma vue Index :

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

Je me suis donc dit que j'avais besoin d'une vue partielle, que j'ai créée 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 originale de l'index (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>

(en utilisant : @Html.Partial("_CreateNote")) Cependant. Cela ne semble pas fonctionner, car j'obtiens 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 c'est dû au fait que la vue Index utilise le modèle différemment, comme dans @model IEnumerable, mais peu importe comment je le modifie, en utilisant RenderPartial, RenderAction, en changeant ActionResult en ViewResult, etc.

Tout conseil serait grandement apprécié ! N'hésitez pas à me faire savoir si vous avez besoin de plus d'informations. Je serais heureux de réduire le projet en entier si nécessaire.

128voto

Richard Dalton Points 20402

Changez le code dans lequel vous chargez la vue partielle :

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

Ceci est dû au fait que la vue partielle attend une Note mais se voit transmettre le modèle de la vue parent qui est le IEnumerable.

38voto

harriyott Points 6659

Vous passez le même modèle à la vue partielle qu'à la vue principale, et ce sont des types différents. Le modèle est un DbSet de Note où vous devez passer dans un simple Note .

Vous pouvez le faire en ajoutant un paramètre, qui, je suppose, étant donné qu'il s'agit du formulaire de création, serait un nouveau fichier Note

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X