1

送信したオブジェクトのリストからデータを表示するビューがあります。これらのオブジェクトはすべて同じ基本クラスですが、さまざまな派生型にすることができます。ので、私は持っています:

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

これらすべてを 1 つのリストに表示し、これらのそれぞれを処理する呼び出し可能な 1 つのコントローラー メソッドを使用できるようにしたいと考えています。メソッドのオーバーロードも問題ありません。

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 に答える