2014-01-14 47 views
3

我试图在一个视图中使用一个元组使用两个模型,但我得到这个错误: '/'应用程序中的服务器错误。如何在ASP.NET MVC中正确使用元组4

The model item passed into the dictionary is of type 'PagedList.PagedList 1[S00117372CA3.Product]', but this dictionary requires a model item of type 'System.Tuple 2[PagedList.IPagedList 1[S00117372CA3.Product],System.Collections.Generic.IEnumerable 1[S00117372CA3.Order]]'.

描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'PagedList.PagedList 1[S00117372CA3.Product]', but this dictionary requires a model item of type 'System.Tuple 2[PagedList.IPagedList 1[S00117372CA3.Product],System.Collections.Generic.IEnumerable 1[S00117372CA3.Order]]'.

这里是我的代码:

@*@model PagedList.IPagedList<S00117372CA3.Product>*@ 
@model Tuple<PagedList.IPagedList<S00117372CA3.Product>, IEnumerable<S00117372CA3.Order>> 
@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].ProductName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].Supplier.CompanyName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].Category.CategoryName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].QuantityPerUnit) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].UnitPrice) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].UnitsInStock) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].UnitsOnOrder) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].ReorderLevel) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1[0].Discontinued) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model.Item1) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.ProductName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Supplier.CompanyName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Category.CategoryName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.QuantityPerUnit) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.UnitPrice) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.UnitsInStock) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.UnitsOnOrder) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.ReorderLevel) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Discontinued) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.ProductID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.ProductID }) 
     </td> 
    </tr> 
} 

</table> 

<div> 
    Page @(Model.Item1.PageCount < Model.Item1.PageNumber ? 0 : Model.Item1.PageNumber) of @Model.Item1.PageCount 
    @if (Model.Item1.HasPreviousPage) 
    { 
     @Html.ActionLink("<<", "Index", new { page = 1}) 
     @Html.Raw(" "); 
     @Html.ActionLink("< Prev", "Index", new {page = Model.Item1.PageNumber - 1}) 
    } 
    else{ 
    @:<< 
    @Html.Raw(" "); 
     @:< Prev 
    } 

    @if (Model.Item1.HasNextPage) 
    { 
     @Html.ActionLink("Next >", "Index", new {page = Model.Item1.PageNumber + 1}) 
     @Html.Raw(" "); 
     @Html.ActionLink(">>", "Index", new {page = Model.Item1.PageCount}) 
    } 
    else{ 
    @:Next > 
    @Html.Raw(" ") 
@:>> 
    } 
</div> 

@foreach (var item in Model.Item2) 
{ 
    @Html.Partial("_Orders") 
} 

这里是我的控制器代码的要求:

var q = (from o in db.Order_Details 
        where o.ProductID == id 
        join ord in db.Orders 
        on o.OrderID equals ord.OrderID 
        orderby o.Quantity descending 
        select ord); 
      var qm = q.Take(3); 
      return PartialView("_Orders", qm.ToList()); 
+0

为什么要用'Tuple'?将两个对象封装在封闭类中。它好得多......并且也将与模型绑定一起工作。 –

+0

,因为我不知道该怎么做。如果你可以发布一个很棒的例子和链接。谢谢 –

+0

问题是,在您的控制器中,您将错误的数据类型传递给视图。你的控制器代码是什么? –

回答

6

从本质上讲,你只是想多个模型传递到您的视图。因为只能将一种类型传递给视图,所以要做的事情就是将模型包装到视图模型中,然后将其传递给视图。喜欢的东西:

public class ProductViewModel 
{ 
    public IPagedList<Product> Products { get; set; } 
    public IEnumerable<Order> Orders { get; set; } 
} 

public ActionResult Index() 
{ 
    var model = new ProductViewModel(); 
    model.Products = // ... fetch from database 
    model.Orders = // ... fetch from database 

    return View(model); 
} 

视图现在可以强类型的视图模型:

@model ProductViewModel 
+0

IPagedList是.net提供的任何新类吗? – Thomas

+0

@Thomas你可以在[github]上找到它(https://github.com/troygoode/PagedList/blob/master/src/PagedList/IPagedList.cs)。 –

相关问题