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



我想记录每个操作方法参数名称及其 数据库中的对应值作为键值对。作为 这个,我正在使用OnActionExecute ActionFilterAttribute,因为它 将是正确的位置(OnActionExecution方法将被调用 所有控制器操作方法调用)以获取操作执行上下文。

我正在获取 .Net 类型的值(字符串、整数、布尔值)。但我是 无法获取用户定义类型(自定义类型)的值。 (例如:登录模型)。我的模型可能有其他嵌套用户 也定义了类型。

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

您能否请任何人协助解决问题。 因为我是新来的 反思。这对我会有所帮助。提前谢谢。 我需要在 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;}
}

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

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

在这种情况下,使用反射和嵌套类,对我来说会导致一些SO(提议?

那么,也许是一条更好的道路?而不是尝试从"上下文"中获取/强制转换属性名称、值(类型?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);
}

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

相关内容

  • 没有找到相关文章

最新更新