2011-01-27 7 views
32

Sto seguendo l'esempio dell'archivio musicale per provare ad imparare ASP.NET MVC. Sto creando un'applicazione per il ricettario.L'elemento del modello è di tipo CookMeIndexViewModel, ma richiede un elemento del modello di tipo IEnumerable <CookMeIndexViewModel>

ho creato il mio ViewModel che assomiglia a questo:

namespace CookMe_MVC.ViewModels 
{ 
    public class CookMeIndexViewModel 
    { 
     public int NumberOfReceipes { get; set; } 
     public List<string> ReceipeName { get; set; } 
    } 
} 

mio controller simile a questa

public ActionResult Index() 
    { 
     var meals= new List<string> { "Dinner 1", "Dinner 2", "3rd not sure" }; 
     //create the view model 
     var viewModel = new CookMeIndexViewModel 
     { 
      NumberOfReceipes = meals.Count(), 
      ReceipeName = meals 
     }; 
     return View(viewModel); 
    } 

Infine mio punto di vista è simile al seguente

@model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th></th> 
     <th> 
      Meals 
     </th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) 
     </td> 
     <td> 
      @item.ReceipeName 
     </td> 
    </tr> 
} 

</table> 

ottengo questo errore .

La voce modello di passato nel dizionario è di tipo CookMeIndexViewModel, ma questo dizionario richiede un elemento del modello di tipo IEnumerable<CookMeIndexViewModel>.

Ho seguito l'esempio. Non riesco a vedere cosa sto sbagliando. Dovrei restituire il mio viewmodel come un elenco generico?

risposta

51

Nella vista si utilizza @model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel> che indica che il modello previsto dalla Vista è di tipo IEnumerable di CookMeIndexViewModel.

Tuttavia nel controller si passa un oggetto di tipo CookMeIndexViewModel come un modello return View(viewModel); quindi l'errore.

O modificare la visualizzazione di avere @model CookMe_MVC.ViewModels.CookMeIndexViewModel

o passare un IEnumerable di CookMeIndexViewModel come modello per la vista nel controller come indicato di seguito:

public ActionResult Index() 
{ 
     var meals= new List<string> { "Dinner 1", "Dinner 2", "3rd not sure" }; 
    //create the view model 
     var viewModel = new CookMeIndexViewModel 
     { 
       NumberOfReceipes = meals.Count(), 
       ReceipeName = meals 
     }; 
     List<CookMeIndexViewModel> viewModelList = new List<CookMeIndexViewModel>(); 
     viewModelList.Add(viewModel); 
     return View(viewModelList); 
} 
+0

grazie cybernate. Scusa se non ho lavorato con Ienurmerables prima come dovrei crearne uno in questo caso? –

+0

Aggiornato il post con codice di esempio.Pls chk – Chandu

+0

Nel mio caso ho dimenticato di assegnare un valore al modello all'interno del viewmodel. Lo stesso errore si è verificato - ma questa risposta mi ha portato nella giusta direzione. Grazie +1 – ppumkin

3

ho ricevuto questo messaggio quando ho avuto un conflitto tra ciò che la direttiva @model nella vista layout _Layout.cshtml e una vista "pagina interna".

La _Layout.cshtml avuto direttiva ..

@model MyProject.Models.MyObject 

mia pagina interna ha avuto ...

@model IEnumerable<MyProject.Models.MyObject> 

stavo lavorando su alcuni test di codice/esperimento e ha colpito questo problema quando ho creato nuovi controller ecc. È stato solo quando ho rinominato Model Object e ho compilato in seguito che ho trovato la fonte del problema.

Spero che questo aiuti.

D.

+0

Ha funzionato anche per me .. Grazie! – Gurusinghe

1

nella griglia ui kendo fare:

public class BookBean 
    { 
     [ScaffoldColumn(false)] 
     public Int32 Id { set; get; } 

     public String Title { set; get; } 

     public String Author { set; get; } 

     public String Publisher { set; get; } 

     [UIHint("Integer")] 
     public Int32 Price { set; get; } 

     [UIHint("Integer")] 
     public Int32 Instore { set; get; } 

     [UIHint("Integer")] 
     public Int32 GroupId { get; set; } 
    } 

in Integer.ascx nella cartella Shared/EditorTemplate fare:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %> 

<%: Html.Kendo().IntegerTextBoxFor(m => m) 
     .HtmlAttributes(new { style = "width:100%" }) 
     .Min(int.MinValue) 
     .Max(int.MaxValue) 
%>