gpt4 book ai didi

asp.net-mvc - 如何在 ASP.NET MVC 2 中的每个 Controller 操作之前执行某些代码?

转载 作者:行者123 更新时间:2023-12-03 07:41:08 25 4
gpt4 key购买 nike

我想检查有关 session 状态、用户代理等的一些信息,并可能在 Controller 方法有机会执行之前采取行动并返回特殊 View 。例如:

最常见:
用户请求首页/索引
系统检查以确保 x != 0。
x 不等于 0,因此 Home/Index Controller 像平常一样执行。

但是,有时:
用户请求首页/索引
系统检查以确保 x != 0。
x 等于零。必须通知用户并且不能允许执行所请求的 Controller 操作。

认为这涉及到 ActionFilters 的使用。但我已经阅读过它们,并且不明白是否可以抢占 Controller 方法并在执行之前返回 View 。我确信我可以在 Controller 方法运行之前执行代码,但是如何防止它在某些实例中运行并返回自定义 View ,或直接到不同的 Controller 方法?

更新:我实现了 RM 的解决方案。这就是我所做的:

public class MyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (myValue == wrongValue)
{
filterContext.Result = new ViewResult{ViewName = "Notice"};
}
base.OnActionExecuting(filterContext);
}
}

现在,当 myValue 错误时,这些用户将获得通知 View ,并且请求的 Controller 永远不会被执行。为了使这项工作正常进行,我将其应用到了我的所有 Controller 都继承自的 ControllerBase。

最佳答案

一切都取决于您到底想做什么以及如何做。以下三个选项:

<小时/>

您可以为此使用路由约束。它们在评估要匹配的路由时执行。

routes.MapRoute(
"HomeWithConstraint",
"Home/{action}",
new {controller="Home", action="index"},
new { x = new MyCustomRouteConstraint () }
);

// without constraint, i.e. if above didnt pass
routes.MapRoute(
"HomeWithConstraint",
"Home/{action}",
new {controller="Home", action="index"}
);

上面的 MyCustomRouteConstraint 类型将检查示例中的 x==0 等。不确定您到底想做什么,但这将允许您在运行前检查条件并设置其他路线值等。

参见here例如自定义路由约束。

<小时/>

或者,是的,您可以使用自定义 ActionFilter,只需将其应用于 Controller 类,并且它将在执行任何操作之前调用。像这样的东西:

public class CheckXActionFilterAttribute : ActionFilterAttribute
{

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(x == 0)
{
// do something
// e.g. Set ActionParameters etc
}
else
{
// do something else
}
}


}
<小时/>

另一种选择是让所有 Controller (或相关 Controller )继承您创建的自定义 Controller ,并覆盖:

OnActionExecuting

参见here了解详情。

与过滤器或路由约束执行相同的操作。

关于asp.net-mvc - 如何在 ASP.NET MVC 2 中的每个 Controller 操作之前执行某些代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com