如何将参数传递给控制器 构造函数?这是正确的做法吗?

问题描述 投票:1回答:2

我可能不会这样做,因为我是这个框架的新手,我希望你能帮助^^

正如您在下面的代码中看到的,在每个操作中我都找到了要更新的表,然后我调用表中的方法。

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"}
            );
c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing
2个回答
4
投票

通常,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);
}

0
投票

将参数传递给不属于控制器的操作。每次请求发生时都会创建控制器。如果您需要它们,可以使用静态属性。可以从任何控制器或操作访问静态属性。

© www.soinside.com 2019 - 2024. All rights reserved.