如何在MVC的同一列表视图中显示2个表中的数据?

时间:2015-08-10 17:11:40

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

我能够根据控制器中的以下SQL查询从我想要的卡表中恢复数据:

SQLstatement = string.Format("select * from cards, cardcollections where isowned = 1 and cards.cardid = cardcollections.cardid and collectionid = {0}", v.CollectionID);
var CardList = db.Cards.SqlQuery(SQLstatement);
return View(CardList.ToPagedList(pageNumber, pageSize));

如果我仅参考卡片型号,它会显示卡片列表而没有我想要的额外数据。我希望能够在同一视图中显示卡集合表(NumberOfCopies)中的一列,就好像它包含在第一个表中一样。如果我在SQL Server Management Studio中运行查询,它会通过将cardcollections列附加到卡表来返回两个表的数据。

我制作了一个视图但无法正确传递。我收到这个错误:

The model item passed into the dictionary is of type 'PagedList.PagedList`1[MTG.Models.Card]', but this dictionary requires a model item of type 'PagedList.IPagedList`1[MTG.Models.ViewCardCollectionView]'.

我知道我没有传递ViewCardCollectionView,因为我设置了CardList变量。我不知道在使用正确的ViewModel时如何进行我想要的查询。

@model IPagedList<MTG.Models.ViewCardCollectionView>

@foreach (var card in Model) {
    <tr>
         <td>
            @Html.ActionLink("Edit", "Edit", new { id=card.Cards.CardID }) |
            @Html.ActionLink("Details", "Details", new { id=card.Cards.CardID }) |
            @Html.ActionLink("Delete", "Delete", new { id=card.Cards.CardID }) |
             @Html.DisplayFor(modelItem => card.CardCollections.NumberofCopies)
        </td>
        <td>
            <b>@Html.DisplayFor(modelItem => card.Cards.Title)</b><br />
            @Html.DisplayFor(modelItem => card.Cards.MainType.Title) - @Html.DisplayFor(modelItem => card.Cards.SubType.Title)  @Html.DisplayFor(modelItem => card.Cards.AdditionalType)<br /> 
AND SO ON...

我的ViewModel是:

public class ViewCardCollectionView
    {
        public Card Cards { get; set; }
        public CardCollection CardCollections { get; set; }

我在控制器中查询了许多变种,并试图将viewmodel带回返回View()但无济于事。任何建议将不胜感激。 :)

2 个答案:

答案 0 :(得分:0)

老实说,处理此问题的最简单方法是熟悉Entity Framework并开始使用它。你不仅要编写许多你不需要的多余代码,而是通过根据用户输入手动构建SQL语句来打开你的SQL注入攻击应用程序(我不确定v.CollectionID来自何处)从但我会假设在应用程序的某个地方有一个安全漏洞,即使它不在那里)。

答案 1 :(得分:0)

我可以通过将控制器更改为以下内容来实现此目的:

 var viewModel = from c in db.Cards
                                join j in db.CardCollections on c.CardID equals j.CardID
                                where (j.IsOwned == true) && (j.CollectionID == v.CollectionID)
                                select new ViewCardCollectionView { Cards = c, CardCollections = j };
                return View(viewModel);