我能够根据控制器中的以下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()但无济于事。任何建议将不胜感激。 :)
答案 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);