1

我有一个视图,它显示我发送的对象列表中的数据。这些对象都是同一个基类,但可以是许多不同的派生类型。所以我有:

class Item { public string Description {get;set;}
class VideoItem : Item { public int VideoId {get;set;} }
class PdfItem : Item { public pdfLocation {get;set;} }

我将这些都显示在一个列表中,并希望能够拥有一个我可以调用的控制器方法来处理其中的每一个。为该方法提供重载也可以。

我将它作为 ActionLink 连接,但我不知道如何将整个对象传递给控制器​​。当我尝试传递类时,它只传递类名(我假设它使用了 .ToString() 方法。

我可以使用某种唯一的 id,然后重新查询数据库并重新创建对象,但似乎如果我已经创建了对象,我应该能够将它完整地传递给控制器​​,不是吗?

也许 ActionLink 不是最好的解决方案。我不在乎控制器是如何被调用的。

想法?

4

1 回答 1

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) } %>

注意:我没有运行此代码,因此可能需要进行一些调整。

于 2012-04-25T20:57:14.750 回答