我不是肯定的,但我认为这是一个MVC路由问题。我仍然不完全理解路由在MVC中是如何工作的。
假设我有几种操作方法,我已将自定义过滤器属性应用于:
[MyAttribute]
public ActionResult Method1()
{
...
}
[MyAttribute]
public ActionResult Method2()
{
...
}
这些方法通常不接受任何参数。不幸的是,需求已经改变,现在所有这些方法都可能正在接收一个名为“MyParameter”的可选参数。如果传入参数,则将设置ViewBag中的属性。
在实际项目中,有大约70种这样的方法。我希望通过“MyAttribute”过滤器来实现它,因为它已经存在。所以我会在“MyAttribute”过滤器中添加类似的内容:
public class MyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
... // other existing code
// If a certain parameter was passed, I want to set a ViewBag property.
if( filterContext.ActionParamenters.ContainsKey("MyParameter") )
filterContext.Controller.ViewBag.MyProperty = filterContext.ActionParamenters["MyParameter"];
}
}
但是除非方法的定义中包含“MyParameter”作为参数,否则它在ActionParameters集合中看不到它。这就是让我觉得这是路由问题的原因。
我真的更愿意不需要将参数添加到所有方法中,但如果没有其他方法可以,那么我可以。任何建议或想法将不胜感激。
答案 0 :(得分:0)
这在动作过滤器中不起作用吗?
ViewBag.MyProperty =
filterContext.Controller.ValueProvider.GetValue("MyParameter").AttemptedValue;
答案 1 :(得分:0)
我发现并接受了这个:
ViewBag.MyProperty = filterContext.HttpContext.Request.Prams["MyParameter"];