将动作过滤器添加到局部视图

时间:2014-01-27 22:25:18

标签: c# asp.net-mvc asp.net-mvc-4

我知道我可以通过将以下内容添加到整个控制器或控制器内部的方法来向视图添加动作过滤器:

[MyActionFilter] <-- Can be placed here...
public class MyController : Controller
{
    [MyActionFilter] <-- ...or here
    public ActionResult Index()
    {
        return View();
    }
}

但是如何将动作过滤器添加到局部视图中呢?

我是否需要在父控制器中声明局部视图,并将其应用于该方法?

[MyActionFilter]
public ViewResult PartialView()
{
    return View("PartialView");
}

我的部分视图在多个视图中被引用,因此我不想将上述代码添加到每个控制器。将上述代码放在基本控制器类中是否可以接受?这样,每个继承基本控制器的类都可以使用该代码。

更新

我通过以下方式实现了我需要的功能,但这是正确的方法吗?

我将下面的方法放在我的基本控制器中,所有控制器都继承这个方法,因此这是唯一需要声明的地方。我将PartialView()方法从ViewResult类型更改为ActionResult类型并返回PartialView

[MyActionFilter]
public ActionResult PartialView()
{
    return PartialView("PartialView");
}

我还必须将视图中的实际引用从@Html.Partial("MyPartialView")更改为@Html.Action("MyPartialView")

1 个答案:

答案 0 :(得分:2)

操作过滤器不适用于视图,它们适用于控制器中的操作方法。

通过这样做:

[MyActionFilter]
public ViewResult MyPartialView()
{
    return View("PartialView");
}

您正在设置要在调用MyActionFilter操作时调用的ActionFilter MyPartialView。因此,要回答您的问题,如果MyPartialView是唯一返回"PartialView"的操作方法,那么您无需在其他地方应用它。

但请考虑在另一个控制器上执行此操作:

public ViewResult AnotherWayToGetMyPartialView()
{
    return View("PartialView");
}

如果您有另一个返回"PartialView"的操作方法,那么您还需要在那里添加ActionFilter,因为它是一个不同的操作方法,而不是视图。

编辑:

您的退货类型是ActionResult还是ViewResult并不重要。 ViewResultActionResult的子类,因此两者都可以工作并调用动作过滤器。但是,对于要调用的Action,因此也是Action Filter,而不仅仅是视图,您需要确保渲染Action而不是视图..。这样:

@Html.Action("MyPartialView") 

而不是:

@Html.Partial("MyPartialView") 

因为最后一个将绕过action方法。