使用方法签名中未指定的参数进行路由

时间:2012-08-29 15:45:53

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我不是肯定的,但我认为这是一个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集合中看不到它。这就是让我觉得这是路由问题的原因。

我真的更愿意不需要将参数添加到所有方法中,但如果没有其他方法可以,那么我可以。任何建议或想法将不胜感激。

2 个答案:

答案 0 :(得分:0)

这在动作过滤器中不起作用吗?

ViewBag.MyProperty = 
  filterContext.Controller.ValueProvider.GetValue("MyParameter").AttemptedValue;

答案 1 :(得分:0)

我发现并接受了这个:

ViewBag.MyProperty = filterContext.HttpContext.Request.Prams["MyParameter"];