我编写了一个 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
名称如何绑定到实际操作参数的论文。
那么哪些规则在这里适用,这样不匹配的名称不会阻止正确调用操作?