2014-06-27 120 views
0

我有一個控制器,擁有50多個返回JsonResult類型的私有函數。我試圖創建一個通用的JsonResult,它接受一個名稱字符串,該名稱字符串對應於50個以上的私有JsonResult函數之一。通過字符串名稱調用JsonResult

我想要做這樣的事情:

public JsonResult View(Guid id, string funcName) 
    {   
     return RedirectToAction(funcName, "myController", new { id = id}); 
    } 

但是這不會工作,因爲「RedirectToAction」返回一個ActionResult,而不是一個JsonResult。 有沒有辦法讓這項工作?

+0

旁註:「50+私有函數」 - 而事實上,行動必須是公開的方法,讓你的樣品有些奇怪。 –

+0

「我有一個擁有50多個私人功能的控制器」這是你需要解決的問題。一個班級中太多的方法會很難維持。如果可以,嘗試重構這些方法。也許你需要在項目中多一個控制器?或者可能把這些方法放在單獨的助手類中? –

+0

聽起來像你有一個主要的結構代碼問題。 – CodingIntrigue

回答

2

您可以使用反射:

public ActionResult View(Guid id, string funcName) 
{   
    return (ActionResult)this.GetType().GetMethod(funcName).Invoke(this, new object[]{id}); 
} 

正如在評論中提到。如果它的私有方法,你將需要添加綁定標誌:

return (ActionResult)this.GetType().GetMethod(funcName, BindingFlags.NonPublic | BindingFlags.Instance).Invoke(this, new object[]{id}); 
+1

+1。反射確實是按名稱調用私有函數的唯一方法(可能需要添加標誌以查找私有方法)。 'RedirectToAction'不會有幫助,因爲'private'方法不能成爲動作。 –

+0

@AlexeiLevenkov ty,已更新回答 – Uriil

+0

是的,這是我所需要的。多謝你們。 – Losbear

0

JsonResult繼承自ActionResult。你可以讓你的View動作返回它。

public ActionResult View(Guid id, string funcName) 
{   
    return RedirectToAction(funcName, "myController", new { id = id}); 
} 

如果您RedirectToAction線返回JsonResult,它會妥善處理這個問題。 MVC不關心。

+0

嗯,沒有試過這個。我想如果我在ActionResult中返回Json,頭文件將會不同,並且會弄亂我的jQuery ajax代碼。我現在就試試。 – Losbear

+0

@Losbear - 注意這個答案的主要部分是「*你的* RedirectToAction行返回一個JsonResult」,因爲框架返回重定向。 –

相關問題