从mvc获取Action参数

时间:2014-08-21 13:45:28

标签: asp.net asp.net-mvc

我正在尝试获取异常请求的参数并记录它们。如果参数是asp.net mvc中的对象,如何从请求中获取操作参数?如果我发送如下参数,我只能得到参数:

public virtual ActionResult TestAction(string A,string B){
}

但不是这样的:

public virtual ActionResult TestAction(ObjectQuery query){
}

我的代码:

protected override void OnException(ExceptionContext filterContext)
{
    string action = filterContext.RouteData.Values["action"].ToString();
    string controller = filterContext.RouteData.Values["controller"].ToString();
    string parameters = filterContext.HttpContext.Request.QueryString
}

修改 QueryString返回空: enter image description here

2 个答案:

答案 0 :(得分:0)

您应该使用反射来实现这一目标:

var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo param in parameters)
{
    //do your logging here
}

答案 1 :(得分:0)

我可能过度简化它,但您可以使用Request.FormRequest.QueryString获取传递给操作的参数。关于它们的好处是它们属于NameValueCollection类型,可以很容易地将它们合并在一起。

然后在相应的控制器上抛出异常,因此您可以通过反射获取方法签名,尽管没有命名参数。

使用下面的简单代码正确地给出了传递给操作的参数,并不关心它是 POST 还是 GET 操作。

protected override void OnException(ExceptionContext filterContext)
    {
        //Get all the info we need to define where the error occured and with what data
        var param = new NameValueCollection {Request.Form, Request.QueryString};
        var controller = filterContext.RouteData.Values["controller"].ToString();
        var action = filterContext.RouteData.Values["action"].ToString();
        var signature = filterContext.Controller.GetType().GetMethod(action).ToString();

        //Let's write it to the stream in this case
        Response.Write(string.Format("<h3>Controller: {0}</h3>", controller));
        Response.Write(string.Format("<h3>Action: {0}</h3>", action));
        Response.Write(string.Format("<h4>Signature: {0}</h4>", signature));

        foreach (var key in param.AllKeys)
        {
            Response.Write(string.Format("<strong>Key:</strong> {0} = {1}<br />", key, param[key]));
        }

        Response.End();
    }

虽然我会想到一些缺点。收藏品可能会以非常不友好的方式呈现。还将显示不应与特定模型绑定的数据。