MVC - 有条件地使用基于对象类型的动作

时间:2012-04-25 20:39:44

标签: asp.net-mvc

我有一个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不是最好的解决方案。我不在乎如何调用控制器。

想法?

1 个答案:

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

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