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.List
1[MvcApplication3.Models.Customer]', but this dictionary requires a model item of type 'MvcApplication3.Models.Customer'.]
1.SetModel (valeur d'objet) +585211
System.Web.Mvc.ViewDataDictionary
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
1 continuation) +242
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
System.Web.Mvc. <> C _ DisplayClass1c.b _ 19 () +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, IList1 filters, ActionResult actionResult) +177
1.End (), mais +57 System.Web. Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction (IAsyncResult asyncResult) +43
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
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
1.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
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?
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>>
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.
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.
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.
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