动作执行时的Asp .Net MVC - 获取操作执行时用户定义类型的动作参数值的值

时间:2014-11-20 19:50:41

标签: asp.net-mvc-4 onactionexecuting

我想记录每个动作方法参数名称及其名称    数据库中的相应值作为键值对。作为...的一部分    这个,我正在使用OnActionExecuting ActionFilterAttribute,因为它    将是正确的地方(OnActionExecuting方法将被调用    所有控制器动作方法调用)来获取动作执行上下文。

我得到.Net类型的值(string,int,bool)。但我是    无法获取用户定义类型(自定义类型)的值。    (例如:登录模式)。我的模型可能有一些其他嵌套用户    也定义了类型。

我试图获取用户定义类型的值,但我是    将唯一的类名称作为字符串。我希望我们能做到    反射。

请你帮忙解决这个问题。因为我是新人    反思。这对我很有帮助。提前致谢。    我需要在OnActionExecuting中获取这些类型的名称和值。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    ActionParameter = new SerializableDictionary<string,string>();

    if(filterContext.ActionParameter != null)
    {
        foreach(var paramter in filterContext.ActionParameter)
        {
            //able to get returnUrl value
            //unable to get model values

            ActionParameter.Add(paramter.Key, paramter.Value);
        }
    }

}

public ActionResult Login(LoginModel model, string returnUrl)
{
     return View(model);
}

用户定义的类型

public class LoginModel
{
    public string  UserName {get;set;}

    public string  Password {get;set;}

    //User defined type

    public UserRequestBase Request {get;set;}

}   

//User defined type
public class UserRequestBase 
{
    public string  ApplicationName {get;set;}
}

我能够在OnActionExecuting中获取returnUrl(登录方法参数)的值,但不能获取模型(登录方法参数)的值。我能够看到值,但不知道如何访问它,我使用typeof即使我无法得到它,但我需要泛型,因为我在控制器中有20个方法所以我不仅可以用于LoginModel。 / p>

1 个答案:

答案 0 :(得分:1)

这个答案不是完全你想要的 - 基于你的问题 - 但我认为它对于想要完成的事情会更好。快点......

在这个实例中使用反射和嵌套类会导致一些SO( a propos?)错误...

那么,也许是一条更好的道路?而不是试图从'context.ActionParameters'获取/转换属性名称,值(类型?),我发现让Json序列化为我做的工作要容易得多。然后你可以持久化Json对象,然后反序列化......非常简单。

无论如何,这是代码:

using Newtonsoft.Json; // <-- or some other serialization entity
//...
 public class LogActions : ActionFilterAttribute, IActionFilter
    {

        // Using the example -- LoginModel, UserRequestBase objects and Login controller...

        void IActionFilter.OnActionExecuting(ActionExecutingContext context)
        {
            var param = (Dictionary<String, Object>)context.ActionParameters;

            foreach (var item in param.Values)
            {
                string itemName = item.GetType().Name.ToString();
                string itemToJson = JsonConvert.SerializeObject(item);


                // Save JsonObject along with whatever other values you need (route, etc)
            }
        }

    }

然后,当您从数据库中检索Json对象时,您只需要反序列化/强制转换它。

LoginModel model = (LoginModel)JsonConvert.DeserializeObject(itemToJson, typeof(LoginModel));

来自示例:

public class LoginModel
{
    public string  UserName {get;set;}

    public string  Password {get;set;}

    //User defined type

    public UserRequestBase Request {get;set;}

}   

//User defined type
public class UserRequestBase 
{
    public string  ApplicationName {get;set;}
}

示例中使用的控制器:

public ActionResult Login(LoginModel model, string returnUrl)
{
     return View(model);
}

希望这会有所帮助。如果还有其他问题,请告诉我,我会尽力帮助。