0

我编写了一个 ActionFilter,它从会话中加载数据并提供操作所需的对象:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionParameters.ContainsKey("ProCalc"))
    {
        throw new InvalidOperationException("Engine already set!");
    }

    // Note: engine is just a simple local variable here!
    Engine engine = SessionHandler.RestoreProCalc();
    filterContext.ActionParameters["ProCalc"] = engine;
}

请注意,我以“ProCalc”的名称返回对象的实例。

操作如下所示:

[RequiresProCalcFilter]
[HttpPost]
public ActionResult Eval(Engine engine)
{
    // code
}

请注意,尽管 in 中的对象类型ActionParameters和实际参数匹配,但我的参数名称不匹配:filter 将对象存储在 name 下ProCalc,但 action 需要engine设置参数。

但是,令我惊讶的是,这确实有效!但是怎么做?

我试图通过 System.Web.Mvc 程序集反汇编我的方式并最终进入ActionDescriptor.ExtractParameterFromDictionary. 但是,如果在字典中找不到给定名称的参数,则此方法会引发异常,因此这是死路一条。我在 Internet 上也找不到任何关于ActionParameters名称如何绑定到实际操作参数的论文。

那么哪些规则在这里适用,这样不匹配的名称不会阻止正确调用操作?

4

0 回答 0