2011-07-25 94 views
0

讓我們說我有3個類A,B和C.B和C從A繼承,它包含字符串字段Name。基於繼承的actionlink asp.net mvc 3

我已經爲每個類實現了控制器As,Bs和Cs。我可以在一個名爲Index由控制器As生成的視圖中列出B和C的所有實例。

控制器Bs和Cs也有一個方法Details,它分別給出了給定B和C實例的id的視圖。

我想知道最簡潔的方式來生成B和C對象的詳細頁面的動作鏈接?我可以使用GetType()並在此基礎上生成控制器名稱,但這看起來有點麻煩。

希望這是有道理的。期待您的迴音。謝謝。

基督教

+0

讓我看看我是否正確遵循。你有AController有一個Index()方法,列出所有的B和C對象,你想創建這些對象的動作鏈接,因此它們根據類型指向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

有人需要做出關於對象類型的決定。剩下的就是你做的地方。如果您只有一個包含所有類型的列表,則可以在控制器中拆分列表。然後重新組合視圖中的類型。

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

如果按類型分別爲他們創造了B和C的對象或查詢爲什麼不乾脆讓那些結果在模型中獨立的名單。