【问题标题】:How to display friendly error message on page and cancel controller action如何在页面上显示友好的错误消息并取消控制器操作
【发布时间】:2012-05-18 15:18:29
【问题描述】:

从视图“x”来看,当用户单击“编辑项目”时,呈现“编辑”页面的控制器操作也在检查用户对该页面的权限。

我要做的是检查这些权限,如果用户没有这些权限,我想在那个“X”视图上显示一条错误消息并取消控制器操作。

现在,我的代码如下所示:

 [HttpPost]
    public virtual ActionResult EditPage(int? itemId)
    {
        var model = new EditPageModel();
        if (itemId.HasValue)
        {
            var obj = new Item(itemId.Value);

   // Check for user's edit permission before we do anything else.

     var request = SecurityRequest.Create(obj, Item_Edit);
     Request.Execute(() => SecurityManager.ValidatePermissions(request));
            if (!request.IsValid(Item_Edit))
            {
                //skip the rest and return error
                Response.StatusCode = (int)HttpStatusCode.Forbidden;
                // Need Help Here!!!
            }

      // Mode code executes      
      return View(model);
    }

【问题讨论】:

  • 对于错误信息,不要忘记大而友好的字母:mantia.me/images/dontpanic_large.jpg
  • 你能不检查之前的权限而不显示编辑链接吗?如果他们不能编辑,为什么要让他们看到呢?
  • 根本不可能不显示编辑链接。在已放置“编辑”按钮的视图中,有一个用户可以/不能编辑的不同项目的列表。在选择每个项目后,我们需要确定他是否可以编辑。理想情况下,我们会基于此禁用/启用“编辑”按钮,但由于这需要回调控制器,我们只是将其保存到用户实际单击“编辑”按钮时。

标签: c# asp.net-mvc asp.net-mvc-3 controller


【解决方案1】:

您可以执行此操作的一种方法(这是我在当前项目中使用的示例)是创建您自己的ActionFilter。这是我的例子:

public class UserAuthenticatedAction : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (IsContextFromLoginController(filterContext))
        {
            return;
        }

        //...Do whatever you need to check.

        if (userNotAllowed){
            SetRedirectToLoginErrorPageForContext(filterContext);
        }

        return;
    }

    private static void SetRedirectToLoginErrorPageForContext(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    { "controller", "Login" },
                    { "action", "LoginError" },
                    { "targeturl" , filterContext.RequestContext.HttpContext.Request.Url.ToString()} }
                });
    }

    private static bool IsContextFromLoginController(AuthorizationContext filterContext)
    {
        var controllerName = GetCurrentControllerName(filterContext);

        return controllerName.Equals("Login");
    }

    private static string GetCurrentControllerName(AuthorizationContext filterContext)
    {
        return filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    }
}

要使用此过滤器,在 global.asax.cs 文件中,我在 Application_Start() 中有这一行:

GlobalFilters.Filters.Add(new UserAuthenticatedAction(excludeActions, allowedRoles));

这意味着每当调用 ActionMethod 时都会执行该属性。基本上它会检查是否允许用户访问特定的 url,如果不允许该用户,则将 filterContext 设置为将他们重定向回登录页面。

我还检查当前url是否已经是登录页面;如果是这种情况,请不要费心进行安全检查。

我想有更多奇特的方法可以做到这一点,具体取决于您的要求,但上述方法可以很好地满足我们的需求。

【讨论】:

  • 这是一个不错的答案。我没有使用 ActionFilters,所以这个回复会刺激我以后有一个愚蠢的。谢谢。
  • 同意。这是最好的方法,但不是我最终使用的方法。无论如何,我认为这是“答案”。谢谢。
【解决方案2】:

您可以使用 AJAX 请求来调用 EditPage 操作。如果授予权限,它可以返回回调以重定向到完整的编辑页面(到类似EditPageView 的操作)。否则,可能会返回对错误消息的回调。

【讨论】:

    【解决方案3】:

    您始终可以重定向到错误页面并显示适当的消息。

    if (!request.IsValid(Item_Edit))
    {
         //skip the rest and return error
         Response.StatusCode = (int)HttpStatusCode.Forbidden;
         ViewBag.errorMessage = "Sorry you do not have access to this page";
         return View("Error")
         // Need Help Here!!!
    }
    

    并且在您的错误页面中(应该在共享视图文件夹中有一个)您可以添加以下行

    @ViewBag.errorMessage
    

    编辑

    如果您不想重定向到错误页面并停留在第 x 页,您可以执行以下操作

    if (!request.IsValid(Item_Edit))
    {
         //skip the rest and return error
         Response.StatusCode = (int)HttpStatusCode.Forbidden;
         ModelState.AddModelError("", "Sorry you do not have access to this page");
         ModelForPageX modelX = new ModelForPageX();
         // do any other setup you need to in order to render page X
         return View("X",modelX)
    
    }
    

    这假设您在页面 X 的视图中有一个 @Html.ValidationSummary 如果不添加以下行

    @Html.ValidationSummary(true, "Unable to process the requested action:")
    

    【讨论】:

    • 理想情况下,我想避免将用户重定向到错误页面。
    • 抱歉误解了原来的问题。
    猜你喜欢
    • 2010-10-14
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-12-18
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多