web-dev-qa-db-fra.com

L'élément de modèle est de type CookMeIndexViewModel, mais nécessite un élément de modèle de type IEnumerable <CookMeIndexViewModel>

Je suis avec l'exemple du magasin de musique pour essayer d'apprendre ASP.NET MVC. Je crée une application de livre de recettes.

J'ai créé mon modèle de vue qui ressemble à ceci:

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

mon contrôleur ressemble à ceci

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

Enfin ma vue ressemble à ceci

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

Je reçois cette erreur.

L'élément de modèle transmis au dictionnaire est de type CookMeIndexViewModel, mais ce dictionnaire nécessite un élément de modèle de type IEnumerable<CookMeIndexViewModel>.

J'ai suivi l'exemple. Je ne vois pas ce que je fais mal. Dois-je renvoyer mon modèle de vue sous forme de liste générique?

32
Diver Dan

Dans votre vue, vous utilisez @model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel> Qui indique que le modèle attendu par la vue est de type IEnumerable de CookMeIndexViewModel.

Cependant, dans le contrôleur, vous passez un objet de type CookMeIndexViewModel en tant que modèle return View(viewModel); d'où l'erreur.

Soit changez la vue pour avoir @model CookMe_MVC.ViewModels.CookMeIndexViewModel

ou passez un IEnumerable de CookMeIndexViewModel comme modèle à la vue du contrôleur comme indiqué ci-dessous:

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);
}
51
Chandu

J'ai reçu ce message lorsque j'ai eu un conflit entre ce que la directive @model dans la vue de mise en page _Layout.cshtml et une vue "page intérieure".

Le _Layout.cshtml avait une directive ..

@model MyProject.Models.MyObject

Ma page intérieure avait ...

@model IEnumerable<MyProject.Models.MyObject>

Je travaillais sur un code de test/expérience et j'ai rencontré ce problème lorsque j'ai créé un nouveau contrôleur, etc. Ce n'est que lorsque j'ai renommé Model Object et compilé par la suite que j'ai trouvé la source du problème.

J'espère que cela t'aides.

Q.

3
David Quinlan

dans kendo ui Grid do:

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

dans Integer.ascx dans le dossier Shared/EditorTemplate, procédez comme suit:

<%@ 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)
%>
1