从控制器传递多个表以查看MVC4时出错

时间:2015-04-24 08:50:06

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

我尝试使用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的类型。

2 个答案:

答案 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; }
}