如何修复传递到字典中的模型项的类型是错误的?

时间:2014-01-31 15:01:28

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在尝试运行我的第一个ASP.NET MVC应用程序。我创建了一个cotroller和视图。数据来自数据库。但是,当项目可以运行但是当我尝试浏览客户页面时,我会收到以下错误。

  

传递到字典中的模型项是类型的   'System.Collections.Generic.List`1 [MvcApplication3.Models.Customer]',   但是这个字典需要一个类型的模型项   'MvcApplication3.Models.Customer'。

我在这里有点困惑,因为错误说它已经请求了模型类型。

堆栈跟踪

  

堆栈追踪:

     

[InvalidOperationException:传递到字典中的模型项   是类型的   'System.Collections.Generic.List 1[MvcApplication3.Models.Customer]', but this dictionary requires a model item of type 'MvcApplication3.Models.Customer'.]
System.Web.Mvc.ViewDataDictionary
1.SetModel(Object value)+585211
  System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary)   +371 System.Web.Mvc.ViewPage 1.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续)+242
  System.Web.Mvc&LT;&GT; C_ DisplayClass1c.b _19()   +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext   controllerContext,IList 1 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()   +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult)   asyncResult)+43
  System.Web.Mvc&LT;&GT; C_ DisplayClass1d.b _18(IAsyncResult的   asyncResult)+14
  System.Web.Mvc.Async&LT;&GT; C_ DisplayClass4.b _3(IAsyncResult的   ar)+23 System.Web.Mvc.Async.WrappedAsyncResult 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
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&LT;&GT; C_ DisplayClass8.b _3(IAsyncResult的   asyncResult)+25
  System.Web.Mvc.Async&LT;&GT; 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(IAsyncResult)   结果)+9
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +9514812 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155

这是我的控制器代码。

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

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

    }
}

这是视图

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

有人可以给我一些解决方法吗?

5 个答案:

答案 0 :(得分:7)

您正在尝试将集合传递给专为单个对象设计的视图。

将您的观点声明更改为

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

答案 1 :(得分:3)

究竟让你感到困惑的是什么?在您的aspx文件中,您已将模型定义为客户,但您将列表传递给它。

预期模型:

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

您的数据:

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

显然是不匹配。

答案 2 :(得分:1)

相关视图(即.cshtml文件)中查找@model声明:ActionResult需要返回模型类的正确实例,例如如果你已经定义了

@model Customer

然后你的ActionResult必须是Customer类型。 您想要返回一个列表,因此您需要定义

@model IEnumerable<Customer>

在视图中。

答案 3 :(得分:0)

传递到字典中的模型项的类型为

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

但是这个字典需要一个

类型的模型项
MvcApplication3.Models.Customer

类型不匹配。

答案 4 :(得分:0)

我遇到了这个问题,这是视图模型的问题。我在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);

但View Form.cshtml的模型错误:

@model ORMVC.Models.Author

所以我把它改成了:

@model ORMVC.ViewModels.AuthorViewModel