我有一个View,它显示我发送的对象列表中的数据。这些对象都是相同的基类,但可以是许多不同的派生类型。所以,我有:
class Item { public string Description {get;set;}
class VideoItem : Item { public int VideoId {get;set;} }
class PdfItem : Item { public pdfLocation {get;set;} }
我将这些全部显示在一个列表中,并且希望能够有一个我可以调用的Controller方法来处理其中的每一个。拥有该方法的重载也没问题。
我将它作为ActionLink连接,但我无法弄清楚如何将整个对象传递给控制器。当我尝试传递类时,它只传递类名(我假设它正在使用.ToString()方法。
我可以使用某种唯一的id,然后重新查询数据库并重新创建对象,但似乎如果我已经创建了对象,我应该能够将它完整地传递给控制器,不是吗?
也许ActionLink不是最好的解决方案。我不在乎如何调用控制器。
想法?
答案 0 :(得分:3)
这样的东西对你有用(假设你想把每个项目的内容显示为一个链接):
创建自定义HtmlHelper方法:
public static class LinkExtensions
{
public static MvcHtmlString CustomActionLink(this HtmlHelper htmlHelper, Item item )
{
MvcHtmlString returnString = "";
if(item is VideoItem)
{
VideoItem currentItem = item as VideoItem;
returnString = htmlHelper.ActionLink(currentItem.VideoId, "Video", "Item");
}
if(item is PdfItem)
{
PdfItem currentItem = item as PdfItem;
returnString = htmlHelper.ActionLink(currentItem.pdfLocation, "Pdf", "Item");
}
else
{
returnString = htmlHelper.ActionLink(currentItem.Description, "Item", "Item");
}
return returnString;
}
}
像这样使用它(假设itemList是List<Item>
类型列表):
<%= foreach(var item in itemList) { Html.CustomActionLink(item) } %>
注意:我没有运行此代码,因此可能需要进行一些调整。