如何将参数传递给控制器 构造函数?这是正确的做法吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将参数传递给控制器 构造函数?这是正确的做法吗?相关的知识,希望对你有一定的参考价值。
我可能不会这样做,因为我是这个框架的新手,我希望你能帮助^^
正如您在下面的代码中看到的,在每个操作中我都找到了要更新的表,然后我调用表中的方法。
public class TableController : Controller
{
private Lobby L;
public TableController()
{
L = Lobby.Instance;
}
public ActionResult Index(uint id)
{
Table T = L.Tables[id];
return View(T);
}
public ActionResult AddPlayer(byte pos, uint id)
{
Table T = L.Tables[id];
...
T.AddPlayer(p, pos);
...
}
...
}
但我注意到我在每个方法中都做同样的事情,所以我虽然可以将表转换为属性,所以我不需要为每个动作找到它。
我想要这样的东西:
public class TableController : Controller
{
private Lobby L;
private Table T;
public TableController(uint tableId)
{
L = Lobby.Instance;
T = L.Tables[tableId];
}
public ActionResult Index()
{
return View(T);
}
public ActionResult AddPlayer(byte pos)
{
...
T.AddPlayer(p, pos);
...
}
这种方法有什么不对吗?
如果这在概念上是正确的,我如何将表ID传递给我的构造函数?这不起作用:(
routes.MapRoute(
"Table",
"Table_{tableId}/{action}/",
new { controller = "Table", action = "Index"}
);
答案
通常,Controller构造函数用于注入依赖项,而不是数据。此外,在这个阶段,this.Request|Response|Session
以及其他基本属性仍然是null
。
试试这个:
protected override void Initialize(RequestContext requestContext)
{
var tableId = Convert.ToUInt32(requestContext.RouteData.GetRequiredString("tableId"));
L = Lobby.Instance;
T = L.Tables[tableId];
base.Initialize(requestContext);
}
另一答案
将参数传递给不属于控制器的操作。每次请求发生时都会创建控制器。如果您需要它们,可以使用静态属性。可以从任何控制器或操作访问静态属性。
以上是关于如何将参数传递给控制器 构造函数?这是正确的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章