2011-07-25 14 views
0

私は3つのクラスA、B、Cを持っているとしましょう。BとCは文字列フィールドの名前を含むAから継承します。actionlink継承ベースasp.net mvc 3

私は各クラスに対してコントローラAs、Bs、およびCsを実装しました。コントローラAsによって生成されたIndexと呼ばれるビューに、BとCのすべてのインスタンスをリストすることができます。

コントローラBsとCには、それぞれBとCのインスタンスのIDを指定してビューを吐き出すメソッドの詳細もあります。

BオブジェクトとCオブジェクトの詳細ページのアクションリンクを作成する最もクリーンな方法については疑問に思っていますか?私はGetType()を使用し、これに基づいてコントローラ名を生成することができますが、これはちょっと面倒なようです。

希望はこれが理にかなっています。あなたからの返信を楽しみにしています。ありがとう。

クリスチャン

+0

私が正しく従っているかどうかを見てみましょう。あなたは、すべてのBおよびCオブジェクトをリストしているIndex()メソッドを持つAControllerを持っていて、これらのオブジェクトのアクションリンクを作成して、タイプに応じてBController/CControllerの適切なDetails()メソッドを指し示しますか? – Dismissile

+0

@Dismissileはい正しいです。 – cs0815

答えて

1

あなたは、コントローラの名前を返します。あなたのクラスに拡張メソッドを定義することができます。

public static class AExtensions 
{ 
    public static string GetControllerName(this A obj) 
    { 
     // put logic to determine type here 
     if(obj is B) return "BController"; 
     else if(obj is C) return "CController"; 
     else return "AController"; 

    } 
} 

次に、あなたのビューで、あなたがあなたのリンクを持つことができます:

@Html.ActionLink("Details", "Details", obj.GetControllerName(), new { id= obj.Id }) 

この方法は、私が汚れていると感じさせるが、うまくいくと思う。

+0

確かにそれは私が避けたいものです。拡張メソッドでは、GetType()を使用してprobsを使用していくつかのケースステートメントを配置することができます。 – cs0815

+0

あなたは何を避けたいですか?拡張メソッド? GetType()を使う? – Dismissile

+0

ご協力ありがとうございます。私はあなたが提案したものよりもクリーナーバージョンがあると信じています。 – cs0815

0

誰かがオブジェクトタイプについて決定する必要があります。残っているのはあなたがそれを行うところです。すべてのタイプのリストが1つしかない場合は、コントローラーでリストを分割できます。その後、ビューでタイプを再結合します。あなたはタイプによって個別に彼らのためにBとCのオブジェクトまたはクエリを作成する場合

foreach (var obj in AllObjs) 
{ 
    if (obj.GetType().Equals(typeof(B)) 
    Model.AllBType.Add(obj); 
    else 
    Model.AllCType.Add(obj); 
} 

@foreach (var obj in Model.AllBType) 
    Html.ActionLink("Details", "Details", "BController", new { id = obj.Id }); 

@foreach (var obj in Model.AllCType) 
    Html.ActionLink("Details", "Details", "CController", new { id = obj.Id }); 

理由だけで、モデル内の独立したリストとしてそれらの結果を保持していません。

関連する問題