2013-02-27 31 views
0

我想實現一個服務模式來爲我的幾個ASP.NET MVC控制器提供一些邏輯。根據邏輯的結果,我可能希望控制器重定向,或給404找不到,或其他各種響應。因此,我希望我的控制器能夠從服務方法中接收參數out ActionResult,以便他們執行這些響應。爲什麼像RedirectToAction()和HttpNotFound()這樣的Controller方法受到內部保護?

問題是,我沒有看到任何方式讓服務生成ActionResult s。由於Controller類中的RedirectToAction()HttpNotFound()等方法設置爲protected internal,因此無法從服務類訪問它們。

製作它們的基本原理是什麼protected internal?我的服務應該如何向控制器表明他們應該返回什麼行動結果?

我想要做的一個例子是允許用戶在幾個地方設置一個配置變量,如果他們有權限的話。控制器代碼看起來是這樣的:

public ActionResult SetVariable(int variableId, int variableValue) { 
    ActionResult actionRes; 
    _svcVars.SetVariable(variableId, variableValue, out actionRes); 
    return actionRes; 
} 

...和服務代碼看起來是這樣的:

public bool SetVariable(int variableId, int variableValue, out ActionResult actionRes) { 
    ConfigRepository repoConfig = new ConfigRepository(); 
    if (!repoConfig.VariableExists(variableId)) { 
     actionRes = HttpNotFound("Could not find config variable"); 
     return false; 
    } 

    if (!repoConfig.VariableMayBeChanged(variableId)) { 
     actionRes = Redirect("/ChangeForbidden.html"); 
     return false; 
    } 

    int variablesListId = repoConfig.SetVariable(variableId, variableValue); 
    actionRes = RedirectToAction("ViewVariablesList", new { listId = variablesListId }); 
    return true; 
} 
+0

你可以使用代碼示例進一步解釋,你想實現什麼? – CR41G14 2013-02-27 10:26:16

回答

1

麻煩的是,我沒有看到任何方式的服務生成ActionResults。

與.NET中的任何對象一樣,您可以使用它的構造函數來創建實例。

就像這樣:

var values = new RouteValueDictionary(new 
{ 
    action = "ViewVariablesList", 
    listId = variablesListId 
}); 
actionRes = new RedirectToRouteResult(values); 

至於爲何在控制器類中的相應方法是保護和內部的,好了,你可以解決的人設計的框架問題。

+0

奇怪的是,那些受保護的內部方法似乎只是實例化對象,幾乎沒有其他任何東西。他們在那裏只是因爲沒有「新」代碼而使代碼「看起來更好」? – Jez 2013-02-27 10:50:23

+0

是的,它們只是爲了讓代碼在控制器內看起來更短。 – 2013-02-27 10:53:10

+0

其實,我只注意到沒有'RedirectToActionResult',所以我猜這個方法會做一些掩蓋工作來產生'RedirectToRouteResult'。 – Jez 2013-02-27 10:54:23

相關問題