我尝试使用ViewModel
从Controller传递2个表进行查看我宣布:
public class Temp
{
public Models.ORDER_HEADER_INFO ORDER_HEADER_INFO { get; set; }
public Models.ORDER_ROUTING_DETAIL ORDER_ROUTING_DETAIL { get; set; }
}
在控制器中我写道:
public ActionResult DataLoading()
{
using (Models.AllDataEntities et = new Models.AllDataEntities())
{
var Odata = (from ord in et.ORDER_ROUTING_DETAIL join
oh in et.ORDER_HEADER_INFO on ord.ORDER_NO equals oh.ORDER_NO
orderby ord.TARGET_COMPLETION_FLAG,oh.PRODUCT_START_DATE
select new {Order_No = oh.ORDER_NO,ROUTING_NAME = ord.ROUTING_NAME,
PJNO = oh.PJNO,DELIVERY_DESTINATION = oh.DELIVERY_DESTINATION,
}).ToList();
return View(Odata);
}
}
在视图中:
<table>
@for (int i = 0; i < Model.Count; i++ )
{
<tr>
<td>@Html.DisplayFor(m=>m[i].ORDER_HEADER_INFO.ORDER_NO)</td>
<td>@Html.DisplayFor(m=>m[i].ORDER_HEADER_INFO.PJNO)</td>
<td>@Html.DisplayFor(m=>m[i].ORDER_ROUTING_DETAIL.ROUTING_NAME)</td>
<td>@Html.DisplayFor(m=>m[i].ORDER_HEADER_INFO.DELIVERY_DESTINATION)</td>
</tr>
}
</table>
当我运行代码时,会出现如下异常:
传递到字典中的模型项是类型的 'System.Collections.Generic.List
1[<>f__AnonymousType3
4 [System.String,System.String,System.String,System.String]]', 但是这个字典需要一个类型的模型项 'System.Collections.Generic.List`1 [TIS.Models.Temp]'。
当我调试时,Data完全加载到Odata,但我无法理解Odata的类型。
答案 0 :(得分:1)
你需要有这个select语句。而不是匿名类型,请选择new Temp() { ... }
。原因是您的视图预计List<temp>
,但您正在从控制器传递list<AnonymousType>
。
var Odata = (from ord in et.ORDER_ROUTING_DETAIL join
oh in et.ORDER_HEADER_INFO on ord.ORDER_NO equals oh.ORDER_NO
orderby ord.TARGET_COMPLETION_FLAG,oh.PRODUCT_START_DATE
select new Temp() {ORDER_HEADER_INFO = oh, ORDER_ROUTING_DETAIL = ord }).ToList();
如果您不想使用实体中的所有属性,则需要使用要使用的属性创建DTO并将其映射到linq查询中。
答案 1 :(得分:0)
您的服务器端代码应在创建列表时实例化Temp对象:
public ActionResult DataLoading()
{
using (Models.AllDataEntities et = new Models.AllDataEntities())
{
var Odata = (from ord in et.ORDER_ROUTING_DETAIL join
oh in et.ORDER_HEADER_INFO on ord.ORDER_NO equals oh.ORDER_NO
orderby ord.TARGET_COMPLETION_FLAG, oh.PRODUCT_START_DATE
select new Temp()
{
ORDER_HEADER_INFO = new ORDER_HEADER_INFO()
{
ROUTING_NAME = ord.ROUTING_NAME
},
ORDER_ROUTING_DETAIL = new ORDER_ROUTING_DETAIL()
{
Order_No = oh.ORDER_NO
}
}).ToList();
return View(Odata);
}
}
您的观点可以在此列表中运行,如下所示:
@model IEnumerable<MvcApplication16.Models.Temp>
<table>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(item.ORDER_HEADER_INFO.ORDER_NO)</td>
<td>@Html.DisplayFor(item.ORDER_HEADER_INFO.PJNO)</td>
<td>@Html.DisplayFor(item.ORDER_ROUTING_DETAIL.ROUTING_NAME)</td>
<td>@Html.DisplayFor(item.ORDER_HEADER_INFO.DELIVERY_DESTINATION)</td>
</tr>
}
</table>
注意:与原始Temp对象定义一样,您直接映射了实体,LINQ将抛出您在注释中提到的错误。
实体或复杂类型&#39; Model.ORDER_HEADER_INFO&#39;不可能是 在LINQ to Entities查询中构造。
您不能(也不应该)投影到映射的实体。但是,您可以投射到匿名类型或DTO上。
我建议您创建修改Temp定义并包含要发送到视图的属性。这将使它成为一个ViewModel对象,这是正确的方法。
public class Temp
{
public string ORDER_NO { get; set; }
public string ROUTING_NAME { get; set; }
}