我编写了一个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
}
请注意,尽管ActionParameters
中的对象类型与实际参数匹配,但我的参数名称不匹配:filter将名称ProCalc
下的对象存储,但是action需要参数{{ 1}}待设置。
但令我惊讶的是,这确实有效!但是如何?
我试图通过System.Web.Mvc程序集反汇编我的方式,最后进入engine
。但是如果在字典中找不到给定名称的参数,则此方法会抛出异常,因此这是一个死胡同。我也无法在互联网上找到关于ActionDescriptor.ExtractParameterFromDictionary
名称如何与实际行动参数绑定的任何文件。
那么这里适用哪些规则,不匹配的名称不会阻止正确调用操作?