46 votos

El uso de vistas parciales en ASP.net MVC 4

Hace poco he comenzado a jugar con ASP.net MVC (4), pero no puedo envolver mi cabeza alrededor de este problema que estoy teniendo. Estoy seguro de que es fácil cuando usted lo sabe.

Estoy esencialmente tratando de hacer la siguiente en mi vista de Índice:

  1. Lista de los elementos actuales en la base de datos de tipo "Nota" en la vista de Índice (que es fácil)
  2. La creación de nuevos elementos en la misma vista de Índice (no tan fácil).

Así que me imaginé que tenía una vista parcial, y que he creado de la siguiente manera (_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>
}

En mi original de la vista de Índice (Index.cshtml) estoy tratando de hacer esta vista parcial:

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

(usando: @Html.Parcial("_CreateNote")) Sin embargo. Esto no parece funcionar, como obtengo el siguiente mensaje de error:

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

Mi NotesController se parece a esto:

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

Creo que tiene que ver con el hecho de que el Índice de vista es utilizando el modelo de manera diferente, como en @modelo IEnumerable, pero no importa cómo lo puedo cambiar, usando RenderPartial, RenderAction, el cambio de ActionResult a ViewResult etc, yo no puedo conseguir que funcione.

Cualquier consejo sería muy apreciada! Por favor, hágamelo saber si usted necesita más información. Yo estaría feliz de cremallera hacia abajo todo el proyecto si es necesario.

82voto

Richard Dalton Puntos 20402

Cambie el código en la que se carga la vista parcial a:

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

Esto es debido a que la vista parcial está a la espera de una Nota, pero se te pasó el modelo de la vista principal, que es la interfaz IEnumerable

29voto

harriyott Puntos 6659

Estás pasando el mismo modelo a la vista parcial como se pasa a la vista principal, y son de diferentes tipos. El modelo es un DbSet de Notes, donde tiene que pasar en una sola Note.

Usted puede hacer esto mediante la adición de un parámetro, que supongo que es el formulario de creación sería un nuevo Note

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: