情况:我正在使用MVC的AuthorizeAttribute保护我的动作。 我有几个包含INSERT,DELETE等功能的UI组件,如果应用程序的最终用户单击某个按钮,这些组件将导致操作。 只有那些允许用户执行的按钮才对用户可见。 为了避免至少两次获得用户操作许可(按钮和控制器操作),我在考虑该按钮可以确定控制器和/或操作的AuthorizeAttribute来控制其可见性。 常规:应用程序具有多个区域和控制器。

我找到了这个答案( 访问ASP.NET MVC应用程序中的Controllers / Actions列表 ),它表明ReflectedControllerDescriptor类可以提供帮助。

有没有一种方法可以从url中确定与mvc-application中现有路由有关的区域,控制器和操作?

一个例子:

我有一个观点:/ shop / products / all

该视图包含两个链接-/ shop / user / recommend-/ system / users / loggedon

动作“ recommend”和“ loggedon”用Authorize属性修饰,并且只有在允许用户执行这些链接的情况下,这些链接才可见。 因此,如果可能的话,我想使用已经附加的属性。

===============>>#1 票数:1

这就是我做的。

我已经更新了答案。 它适用于mvc3。

public class MyActionAttribute : ActionFilterAttribute
{
    private readonly string _conroller;
    private readonly string _action;
    private readonly string _id;

    public class MyActionAttribute : ActionFilterAttribute
    {
    public bool IsAllowed(string _conroller, string _action, string _id)
    {
        //write your logic to check if a user is allowed to perform the given action on this controller,action and id
        return UserisAllowed(_conroller, _action, _id);
    }

     public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var area =filterContext.RouteData.DataTokens["area"];

        if (!IsAllowed(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, filterContext.RouteData.DataTokens["id"].ToString()))
        {
            //send user to somewhere saying you are not allow
            return;
        }

        base.OnActionExecuting(filterContext);
    }
}

现在将此属性应用于控制器操作。

    [MyAction]
    public ActionResult Someview()
    {
         return View();
    }

对于链接,您可以通过这种方式检查

 if (new MyActionAttribute().IsAllowed("yourcontroller","youraction","id"))
    {
          Html.ActionLink(whatever)
    }

我希望这可以让您开始。 这样,您的逻辑就保留在一个地方,可以用于编辑/删除类型链接,也可以用于控制器。

  ask by xforfun translate from so

未解决问题?本站智能推荐:

3回复

ASP.NET MVC ActionLink没有选择正确的控制器

问题背景: 我正在尝试将一个变量 - 在这种情况下是url中的int'productId'变量'传递给ActionLink方法中指定的控制器和操作方法。 问题: 我的路线设置如下: 我的'Products.cshtml'视图中的'ActionLink' - 由名为'Ho
1回复

路由问题ASP.net MVC 4没有重定向到索引操作

当我尝试使用以下URL格式访问控制器上的索引页面时: 这有效,并且Index页面打开。 但是,如果我使用这种url格式(我不将Index操作添加到URL) 我收到“ 404未找到”,但通常它应该可以正常工作,并自动将我重定向到索引页。 请如何解决? Taux控制器:
1回复

如何在ASP.NET MVC 4中创建本地化的URL

我正在尝试在asp.net mvc中创建本地化的url。 让我解释更多。 即 ControllerName:收件人 方法名称:索引 我想根据语言更改控制器的名称。 即 “ en-gb:uk.test.com/recipt” “ fr-BE:be.test.
1回复

在Route属性ASP.NET MVC的URL中添加自定义单词

如何在某些MVC调用的URL中添加自定义,用户定义的单词? 例如,我在控制器的方法上具有此属性: 我正在尝试将路由更改为以下形式: /accounts/{accountNumber}/transactions 其中accountNumber是可更改的,并在发送请求时由客户端发
1回复

ASP.NET MVC路由任务

我有以下路由表: 因此,当我们拥有类似http:// mysite / abcde的 url时,它调用UserController,动作索引;如果我们拥有类似http:// mysite / dashboard / Index的 url,则它称为DashboardController,动
1回复

ASP.NET MVC4路由

有人可以告诉我如何为该控制器动作编写路线吗? 我收到此错误,但不确定为什么或如何解决: The parameters dictionary contains a null entry for parameter 'PID' of non-nullable type 'System.Int32
2回复

用扩展重写asp.net-mvc4(剃刀)中的URL

带有路由的asp.net-mvc4的默认值为http://domainname.com/products/1 并且我想重写为具有.html扩展名的http://domainname.com/products/1.html 。 有什么想法吗?
3回复

控制器名称上的MVC路由约束

我的路线设置如下: 而且我迫切希望将Area/friendlyAccountName/Home带我到Dashboard()但这不起作用(404)。 我认为原因是我们去寻找一个friendlyAccountName控制器。 知道如果我应该选择在我的一个控制器之后命名一个帐户,一切都
1回复

ASP.NET MVC路由不适用于.html扩展名

我使用ASP.NET MVC开发了一个Web应用程序。 我的路线有问题。 我需要这样的路线。 http://localhost/content-name/23.html 我为此定义了一条路线 但是这条路线不起作用。 IIS向我显示404页面。 当我删除.html扩展名
2回复

ASP.NET MVC 4-MapRoute配置以删除“ / Home”(已存在的默认配置)

我有一个解决方案,其中初始和默认(RouteConfig)页面为“登录/索引”。 该页面上的名称让人理解,用于用户在系统上进行登录。 成功登录后,将被重定向到主页。 登录页面上显示的URL是http:// localhost:7037 /之后,在“主页”页面中是http:// loca