2012-04-25 6 views
1

私は、送信するオブジェクトのリストからのデータを表示しているビューを持っています。これらのオブジェクトはすべて同じ基本クラスですが、いくつかの異なる派生型にすることができます。そう、私が持っている:MVC - オブジェクトタイプに基づくアクションを条件付きで使用する

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のは最善の解決策ではありません。私は、コントローラが呼び出されるかを気にいけない。

アイディア?

+0

より多くのコードを投稿してください。あなたのコントローラを表示し、同様に表示します。 –

+0

ActionLinkはHTTP Getです。すべてのデータはクエリ文字列の一部でなければなりません。最も簡単な方法は、それぞれのクラスでToStringメソッドをオーバーロードして、クエリーストリングが –

答えて

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

注:私はいくつかの調整をこのコードを実行しなかったことを必要になる。

+1

になるような文字列を生成することです。これは、同じ基本アイデアでなくても構いません –

+0

これは私が期待していたものではありませんが、完璧に動作します。ありがとう..私は答えとしてあなたをマークしています、そして、それが終わったら私は最終的な解決策を投稿します。 – Rob

関連する問題