我有什么选择将变量传递到MyCustomAttribute
类?
目前该课程定义为:
public class MyCustomAttribute : ActionFilterAttribute
{
public string MyIDParam { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var myID = filterContext.ActionParameters[MyIDParam] as Int32?;
// logic
}
}
现在我的控制器中有这个:
[MyCustomAttribute(MyIDParam = "id")]
public ActionResult Report(int id)
{
Guid userId = GetUserInfo();
// logic
}
在这种情况下,我希望能够将id
和userId
传递给MyCustomAttribute
课程。
这可能吗?在MyCustomAttribute
方法的内容之前,Report
是否未执行?
答案 0 :(得分:0)
将变量传递到MyCustomAttribute类有哪些选择?
嗯,您正在编写MVC通过ActionFilter
的自定义ActionExecutingContext
。该变量包含大量可供您使用的信息。
public class MyCustomAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var myID = filterContext
.RouteData["id"] as int?
var user = filterContext.Controller.User;
}
}
在这种情况下,我希望能够通过" id"和" userId"到MyCustomAttribute类。
不,你无法通过它们,你必须从ActionExecutingContext撤回它们。
在Report方法的内容之前,是否没有执行MyCustomAttribute?
也许?取决于你的覆盖方法。
ActionFilterAttribute有几个不同的点,它执行。这是一个细分:
ActionFilterAttribute.OnActionExecuting() // Action Filter
public ActionResult Report(int id) // MVC Action is Called
ActionFilterAttribute.OnActionExecuted() // Action Filter
ActionFiltrAttribute.OnResultExecuting() // Action Filter
ActionResult.Execute() // MVC ActionResult Execute is Called
ActionFilterAttribute.OnResultExecuted() // Action Filter
自these methods have been available to access to all this data版本1以来,您可以看到asp.net-mvc。
答案 1 :(得分:0)
您可以通过在自定义属性中添加对引用操作参数的支持来获得该功能。
[MyCustomAttribute("The parameter for id is {id}")]
public ActionResult Report(int id)
{
Guid userId = GetUserInfo();
... logic ...
}
在运行时,您的自定义属性可以替换占位符的引用参数的值 因此,为了实现此功能,您只需要挂钩ActionExecuting方法来获取这些操作参数:
private IDictionary<string, object> _parameters;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_parameters = filterContext.ActionParameters;
base.OnActionExecuting(filterContext);
}
然后在OnActionExecuted
方法中,您可以创建一个变量到已处理字段。然后,您可以浏览字典中的每个参数并替换参数的值:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var data = MyIDParam;
foreach(var kvp in _parameters)
{
data = data.Replace("{" + kvp.Key + "}",
kvp.Value.ToString());
}
}