是否可以透明地获取/发布参数"采取行动?

时间:2015-04-26 16:46:51

标签: asp.net-mvc asp.net-web-api asp.net-mvc-5 asp.net-web-api2

是否可以发布/获取未映射到动作参数的参数? 我的意思是做什么样的事情

 $.ajax({ url: url, data: {'id'=7,'CorrelationToken'=correlationToken } })

其中correlationToken只能从httpRequest或"控制器级别"领域? E.g。

class myController: ApiController
{
   Guid CorrelationToken {get; set;}
   public void Action(int id)
   {
        // ...
   }
}

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是编写一个自定义控制器工厂 将读取请求发布的值,然后将值分配给它创建的控制器。

像这样的东西(未经过测试,但你应该明白这一点):

public class My_Controller_Factory : DefaultControllerFactory
{
    public override IController CreateController
    (System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        string controllername = requestContext.RouteData.Values["controller"].ToString();
        Type controllerType = Type.GetType(string.Format(
            "Custom_Controller_Factory.Controllers.{0}",controllername));
        IController controller = Activator.CreateInstance(controllerType) as IController;
        if (controllerName == "MyController")
            ((MyController)IController).CorrelationToken = Request["CorrelationToken"];
        return controller;
    }
    public override void ReleaseController(IController controller)
    {
        IDisposable dispose = controller as IDisposable;
        if (dispose != null)            
        {
            dispose.Dispose();
        }
    }
}     

见这里:

http://www.codeproject.com/Tips/732449/Understanding-and-Extending-Controller-Factory-i

也许更简单的方法是简单地在控制器构造函数中设置值。

public class MyController : Controller
{
    public MyController()
    {
        CorrelationToken = Request["CorrelationToken"];
    }
}

但是,这里的现实是你可能不需要这样做。您的CorrlationToken可能仅用于记录,并且只需在需要时使用Request本身就很容易。

Log.Debug("CorrlelationToken: {0}", Request["CorrelationToken"]);