我想记录每个操作方法参数名称及其 数据库中的对应值作为键值对。作为 这个,我正在使用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);
}
希望这有帮助。如果还有其他问题,请告诉我,我会尽力提供帮助。