asp.net-mvc-3 - .NET MVC 3 自定义 Controller 属性

标签 asp.net-mvc-3

这可能是天上掉馅饼,但我想知道是否可以使用自定义 Controller 属性来完成以下操作。

对于我的大多数 Controller ,我将向 Controller 内的每个操作传递一个名为“r”的 URL 参数。 “r”与我数据库中的竞赛表中的竞赛 ID 相关联。

我希望发生的是,每当调用 Controller 操作时,它都会自动检查“r”是否存在,查询数据库以确保“r”属于登录用户并设置一个名为 ViewBag.RaceId 的 viewbag 变量等于“r”。

如果不满足其中任何条件,它会将其重定向回登录页面。

我正在努力使我的代码尽可能干燥。

任何指导将不胜感激。

最佳答案

您可以编写自定义Authorize属性:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (isAuthorized)
        {
            var request = httpContext.Request;
            // Fetch "r" from the route data or request
            var r = request.RequestContext.RouteData.Values["r"] 
                ?? request["r"];
            var currentUser = httpContext.User.Identity.Name;
            if (!CheckIfRBelongsToTheCurrentLoggedInUser(currentUser, r))
            {
                return false;
            }
        }
        return isAuthorized;
    }
}

现在剩下的就是用这个自定义属性来装饰你的 Controller / Action :

[MyAuthorize]
public ActionResult Foo()
{
    //...
}

如果您想将某些内容放入 ViewBag 中,您可以将其临时存储在 AuthorizeCore 方法内的 httpContext.Items 中(如果成功的话),然后覆盖 OnAuthorization 方法,并检查上下文中是否存在此项。如果存在,您可以将其存储在 filterContext.Controller.ViewBag 中。

关于asp.net-mvc-3 - .NET MVC 3 自定义 Controller 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5995607/

相关文章:

validation - ASP.NET MVC 3 : unobtrusive JavaScript validation

c# - 值不能为空;参数名称 : constructor when using SqlExecuteQuery with an abstract Entity model

asp.net-mvc-3 - 单元测试因 Sessions 而失败

jquery - 如何在用户单击链接时将页面重置为初始比例?

c# - 如何将 DatePicker 添加到我的 MVC3 C# 站点

asp.net - Razor 与 ASPX 语法的比较

c# - 如何在 Entity Framework 4 中获取 SQL 2008 的下一个主键

c# - 是否可以在用户登录之前保存购物车数据客户端?

asp.net-mvc - ASP.NET MVC 3 (Razor) Ajax.ActionLink - 我做错了什么?

vb.net - MVC 3 错误处理的正确编码示例