web-dev-qa-db-fra.com

Comment réparer l'élément de modèle passé dans le dictionnaire est de type erreur?

J'essaie d'exécuter ma première application ASP.NET MVC. J'ai créé un cotroller et une vue. Les données proviennent de la base de données. Cependant, lorsque le projet peut s'exécuter mais lorsque j'essaie de naviguer dans la page client, l'erreur suivante s'affiche.

L'élément de modèle transmis au dictionnaire est de type 'System.Collections.Generic.List`1 [MvcApplication3.Models.Customer]', mais ce dictionnaire nécessite un élément de modèle de type 'MvcApplication3.Models.Customer'.

Je suis un peu confus ici, car l'erreur indique qu'il a demandé le type de modèle.

La trace de pile est

Trace de la pile:

[InvalidOperationException: l'élément de modèle transmis au dictionnaire est de type 'System.Collections.Generic.List1[MvcApplication3.Models.Customer]', but this dictionary requires a model item of type 'MvcApplication3.Models.Customer'.]
System.Web.Mvc.ViewDataDictionary
1.SetModel (valeur d'objet) +585211
System.Web.Mvc.ViewDataDictionary..ctor (dictionnaire ViewDataDictionary) +371 System.Web.Mvc.ViewPage1.SetViewData(ViewDataDictionary viewData) +48 System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page) +73
System.Web.Mvc.WebFormView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +38
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +295 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 continuation) +242
System.Web.Mvc. <> C _ DisplayClass1c.b _ 19 () +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, IList1 filters, ActionResult actionResult) +177
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +89 System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102 System.Web.Mvc.Async.WrappedAsyncResult
1.End (), mais +57 System.Web. Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction (IAsyncResult asyncResult) +43
System.Web.Mvc. <> C _ DisplayClass1d.b _ 18 (IAsyncResult asyncResult) +14
System.Web.Mvc.Async. <> C _ DisplayClass4.b _ 3 (IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult
1.End () +62
System.Web.Mvc.Controller.EndExecute (IAsyncResult asyncResult) +47
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute (IAsyncResult asyncResult) +10
System.Web.Mvc. <> C _ DisplayClass8.b _ 3 (IAsyncResult asyncResult) +25
System.Web.Mvc.Async. <> C _ DisplayClass4.b _ 3 (IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult`1.End () +62
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +47 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (résultat IAsyncResult)
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +9514812 System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & completedSynchronously) +155

Voici mon code de contrôleur.

namespace MvcApplication3.Controllers
{
    public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult Index()
        {
            Models.NorthwindDataContext nwd = new Models.NorthwindDataContext();
            return View(nwd.Customers.ToList());
        }

    }
}

Voici la vue

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication3.Models.Customer>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Index</h2>

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>

<asp:Content ID="Content4" ContentPlaceHolderID="ScriptsSection" runat="server">
</asp:Content>

Quelqu'un peut-il me donner un indice pour résoudre ce problème?

14
newday

Vous essayez de transmettre une collection à une vue conçue pour un seul objet.

changez votre déclaration de vue en

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication3.Models.Customer>>

7
D Stanley

Qu'est-ce qui vous déroute exactement? Dans votre fichier aspx, vous avez défini le modèle en tant que client, mais vous lui transmettez plutôt une liste.

Modèle attendu:

System.Web.Mvc.ViewPage<MvcApplication3.Models.Customer>

Vos données:

return View(nwd.Customers.ToList());

Évidemment un décalage.

3
walther

Dans votre vue related (le fichier .cshtml), recherchez la déclaration @model: la variable ActionResult doit renvoyer l'instance correcte de la classe de modèle, par exemple si vous avez défini

@model Customer

alors votre ActionResult doit être de type Customer. Vous voulez renvoyer une liste, vous devez donc définir

@model IEnumerable<Customer>

dans la vue.

1
Matt

L'élément de modèle passé dans le dictionnaire est de type

System.Collections.Generic.List1 [MvcApplication3.Models.Customer]

mais ce dictionnaire nécessite un élément de modèle de type

MvcApplication3.Models.Client

Incompatibilité de type.

0
Matt Webber

J'ai eu ce problème et c'était un problème de modèle de la vue. J'ai eu ce code dans mon projet MVC:

var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Author, AuthorViewModel>();
        });

        IMapper mapper = config.CreateMapper();
        var dest = mapper.Map<Author, AuthorViewModel>(author);

        return View("Form", dest);

mais View Form.cshtml avait le mauvais modèle:

@model ORMVC.Models.Author

Alors je l'ai changé pour:

@model ORMVC.ViewModels.AuthorViewModel
0
nahuelmisc