2012-12-18 2 views
74

Я недавно начал играть с ASP.net MVC (4), но я не могу обернуть голову вокруг этой одной проблемы, которую я имею. Я уверен, что это легко, когда вы это знаете.Использование частичных представлений в ASP.net MVC 4

Я в основном пытаются сделать следующее, на мой взгляд Индекс:

  1. Список текущих элементов в базе данных типа «Примечание» в представлении Index (это легко)
  2. Создание нового элементы в том же Индексе (не так просто).

Так я понял, что мне нужно частичный вид, и что я создал следующим образом (_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> 
} 

В моем первоначальном виде индекса (Index.cshtml) Я пытаюсь делают этот частичный вид:

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

(с использованием: @ Html.Partial ("_ CreateNote")) Однако. Это, кажется, не работает, так как я получаю следующее сообщение об ошибке:

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 

Мой NotesController выглядит следующим образом:

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

Я думаю, что это связано с тем, что Индексный является используя модель по-разному, как в @model IEnumerable, но независимо от того, как я ее изменяю, используя RenderPartial, RenderAction, меняя ActionResult на ViewResult и т. д., я не могу заставить его работать.

Любые советы были бы высоко оценены! Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Я был бы рад закрепить весь проект, если понадобится.

ответ

122

Изменить код, где вы загружаете частичный вид:

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

Это происходит потому, что частичный вид ожидает Примечание, но получение передается модель родительского вида, который является IEnumerable

+5

Вы правильно! Большое спасибо! Я фактически пробовал почти то же самое множество раз, но не понял, что мне нужно «новое» заявление. Stupid me :( –

37

Вы передаете ту же модель в частичный вид, который передается на главный вид, и они разные. Модель DbSetNote s, где вы должны пройти.

Вы можете сделать это, добавив параметр, который я предполагаю, что, как это создать форму будет новый Note

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

Да, правильно! Кажется, я пропустил некоторые основы MVC. Спасибо! –

Смежные вопросы