2009-02-17 31 views
2

我建立一個控制器,其他控制器可以繼承(跨站點提供的基本功能,而不必重複代碼):在.Net MVC中,如何從Action之外的URL路由訪問變量?

public abstract class ApplicationController : Controller 
{ 
    protected ApplicationController() 
    { 
     //site logic goes here 
     //what is the value of agentID from the Action below?? 
    } 
} 

public class AgentController : ApplicationController 
{ 
    public ActionResult Index(string agentID) 
    { 
     return View(); 
    } 
} 

應用於整個站點將進入的ApplicationController類的構造函數的邏輯。

問題在於,我需要從Action中訪問參數中的值,在這種情況下,agentID(它將在整個站點中相同)。有沒有辦法讀取這個值?

回答

1

我想出瞭如何去做......與Craig Stuntz的答案非常相似,但區別在於你如何到達RouteData。

使用ControllerContext.RouteData.Values在這種方式使用的常規方法中不起作用(它從原始控制器執行,但不是像我構建的那樣從基礎控制器執行),但是我確實通過重寫OnActionExecuting方法:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string agentID = filterContext.RouteData.Values["agentID"].ToString(); 
     OtherMethodCall(agentID); 
    } 
0

有,但你需要重寫ControllerFactory。在您的global.asax.cs方法RegisterRoutes,加入這一行:

public static void RegisterRoutes(RouteCollection routes) { 
    // Route code goes here 
    ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory)); 
} 

,然後定義你的MyControllerFactory

public class MyControllerFactory : DefaultControllerFactory { 
    public override IController CreateController(RequestContext requestContext, string controllerName) { 
     // poke around the requestContext object here 
     return base.CreateController(requestContext, controllerName); 
    } 
} 

requestContext對象有所有的路由數據和值吧。你可以用它來傳遞任何你想要的控制器的構造函數。

編輯補充說,這是大多數受歡迎的依賴注射器(例如,StructureMap)的工作方式。

1

行爲發生構造函數。該值在構造函數中不存在(尚未綁定)。路由數據可能在構造函數中是已知的,但動作數據綁定當然不會發生。您不能肯定得到這個值,直到行動被調用。

路由數據可以在控制器內部通過以下方式訪問:

ControllerContext.RouteData.Values 

但是,是不正確的假設,AGENTID只能綁定到路由數據。實際上,它可能來自服務器變量,表單字段,查詢字符串參數等。我的建議是在需要的地方明確地傳遞它。如果沒有別的,它會讓你的單元測試更好。

+0

不,是行不通的。它在原始控制器(我的例子中是AgentController)中工作,但不在從(ApplicationController)繼承的控制器中。它作爲對象未被設置而返回。 – 2009-02-17 16:35:59

相關問題