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