Linq to sql 传入字典的模型项的类型为';System.Data.Linq.DataQuery`1[Models.MailListViewModel]&x27;
我得到一个错误,说: 传递到字典的模型项的类型为“System.Data.Linq.DataQuery`1[WebUI.Models.MailListViewModel]”,但此字典需要类型为“WebUI.Models.MailListViewModel”的模型项 这在我的控制器中:Linq to sql 传入字典的模型项的类型为';System.Data.Linq.DataQuery`1[Models.MailListViewModel]&x27;,linq-to-sql,model-view-controller,Linq To Sql,Model View Controller,我得到一个错误,说: 传递到字典的模型项的类型为“System.Data.Linq.DataQuery`1[WebUI.Models.MailListViewModel]”,但此字典需要类型为“WebUI.Models.MailListViewModel”的模型项 这在我的控制器中: public ViewResult List() { var mailToShow = from m in mailRepository.Mail join
public ViewResult List()
{ var mailToShow = from m in mailRepository.Mail
join p in profilesRepository.Profiles on m.SenderId equals p.ProfileId
select new MailListViewModel
{
SenderId = m.SenderId,
ProfileId = p.ProfileId,
UserName = p.UserName,
Subject = m.Subject
};
return View(mailToShow);
}
这在我的MailListViewModel中:
public class MailListViewModel
{
public int SenderId;
public int ProfileId;
public string UserName;
public string Subject;
}
我认为:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.Models.MailListViewModel>" %>
<% foreach (var m in (IEnumerable)Model)
{ %>
<tr>
<td>
</td>
<td>TODO image</td>
<td>
<%: Model.SenderId %></td>
<td><%: Model.Subject%></td>
</tr>
<% } %>
待办事项图像
错误消息似乎相互冲突,表示我使用的是正确的模型
我该怎么办?您的查询将返回一个
IQueryable
,对于查询中的每个结果,本质上都是一个MailListViewModel
。您的视图只需要一个MailListViewModel
您应该更新视图以期望IEnumerable
,如下所示:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Collections.Generic.IEnumerable<WebUI.Models.MailListViewModel>>" %>
此外,一旦您完成了这项操作,就不应该将
模型
强制转换为IEnumerable
,因为这将导致枚举中的每个项都被视为类型对象
,因此它将看起来好像您的属性都不存在。很好,现在几乎可以工作了!更新视图后,我收到消息:CS1061:“object”不包含“Subject”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Subject”(是否缺少using指令或程序集引用?)突出显示:Intellisense说:无法解析符号“主题”,我下一步应该尝试什么?如果您仍然将模型转换为IEnumerable,可能就是这样。我已经相应地更新了我的答案。Closer:)现在我收到一个错误,它说:“查询包含对在不同数据上下文中定义的项的引用。”它指的是这样一行:“您不能跨两个数据上下文联接。您必须只使用一个或转换为(过滤的)列表(.ToList())然后加入列表,因为这将使用LinqToObjects。谢谢。我现在将尝试两种不同的查询,看看是否有效,如果无效,我将尝试列表解决方案。