Pregunta Usar vistas parciales en ASP.net MVC 4


Recientemente comencé a jugar con ASP.net MVC (4), pero no puedo entender este problema que estoy teniendo. Estoy seguro de que es fácil cuando lo sabes.

Básicamente trato de hacer lo siguiente en mi vista de índice:

  1. Enumere los elementos actuales en la base de datos de tipo "Nota" en la vista de índice (eso es fácil)
  2. Crear nuevos elementos en la misma vista de índice (no tan fácil).

Así que pensé que necesitaba una vista parcial, y que he creado como siguiente (_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 vista de índice original (Index.cshtml) estoy intentando mostrar 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.Partial ("_ CreateNote")) Sin embargo. Esto no parece funcionar, ya que aparece 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 ve así:

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 la vista de índice está usando el modelo de manera diferente, como en @model IEnumerable, pero no importa cómo lo cambio, usando RenderPartial, RenderAction, cambiando ActionResult a ViewResult, etc., no puedo obtener para que funcione

¡Algún consejo sería de gran aprecio! Por favor, avíseme si necesita más información. Me encantaría comprimir todo el proyecto si es necesario.


75
2017-12-18 14:04


origen


Respuestas:


Cambie el código donde carga la vista parcial a:

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

Esto se debe a que la vista parcial está esperando una Nota, pero se está aprobando el modelo de la vista padre que es IEnumerable


125
2017-12-18 14:08



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

Puedes hacer esto agregando un parámetro, que supongo que es la forma de crear sería una nueva Note

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

38
2017-12-18 14:09