2010-03-12 93 views
9

我有點驚訝,幾分鐘前,當我試圖在我的控制器重載控制器操作

的一個超載的行動我有

public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

我加

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 

。 ...突然間都沒有工作

我解決了這個問題,使'ID'爲空,並擺脫的其他兩種方法

public ActionResult Get(int? id) 
{ 
    if (id.HasValue) 
     return PartialView(/*return 1 thing*/); 
    else 
     return PartialView(/*return everything*/); 
} 

它的工作,但我的代碼只是有點難看!

有何意見或建議?我必須忍受我的控制器上的這個缺陷嗎?

感謝

戴夫

回答

4

,你發現你不能用這種方式過載動作。

使用同一名稱進行多個操作的唯一方法是如果他們響應不同的動詞。

我認爲使用單一方法可以處理這兩種情況,這是一種更清潔的解決方案,並且允許您將邏輯封裝在一個地方,而不需要知道具有用於不同目的的具有相同名稱的多個方法。 - 當然這是主觀的,只是我的看法。

如果你真的想要有獨立的方法,你可以用不同的名稱命名它們,以便它們清楚地表明它們的不同目的。例如:

public ActionResult GetAll() 
{ 
    return PartialView(/*return all things*/); 
} 

public ActionResult Get(int id) 
{ 
    return PartialView(/*return 1 thing*/); 
} 
+0

@Matt,好點。它應該是GetAll()。 – DaveDev 2010-03-12 16:15:29

1

在我看來,它真的有意義,你說的戴夫。例如,如果我有一個select可以選擇所有內容或單個記錄,我不想爲此使用不同的方法,而只需要一個帶有重載的方法,就像示例中顯示的那個Dave一樣。

// MRW

0

我沒有看到一個正確的答案在這裏,所以我要發佈一個正確的答案。

是的,您可以通過使用ActionName屬性重載MVC中的操作結果。

[ActionName("Get")] 
public ActionResult Get() 
{ 
    return PartialView(/*return all things*/); 
} 

[ActionName("GetById")] 
public ActionResult Get(int? id) 
{ 
    //code 
} 
相關問題