C# 如何在页面上显示友好的错误消息并取消控制器操作

C# 如何在页面上显示友好的错误消息并取消控制器操作,c#,asp.net-mvc,asp.net-mvc-3,controller,C#,Asp.net Mvc,Asp.net Mvc 3,Controller,在视图“x”中,当用户单击“编辑项”时,呈现“编辑”页面的控制器操作也在检查用户对该页面的权限 我试图做的是检查这些权限,如果用户没有这些权限,我希望在该“X”视图上显示一条错误消息,并取消控制器操作 现在,我的代码如下所示: [HttpPost] public virtual ActionResult EditPage(int? itemId) { var model = new EditPageModel(); if (itemId.HasV

在视图“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);
    }

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

可以这样做的一种方法(这是我在当前项目中使用的示例)是创建自己的。下面是我的例子:

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\u Start()
中有这一行:

GlobalFilters.Filters.Add(新的UserAuthenticatedAction(excludeActions,allowedRoles))

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

我还检查当前url是否已经是登录页面;如果是这样的话,那就不用麻烦做安全检查了


我想,根据您的要求,有更多更奇特的方法可以做到这一点,但上述方法适合我们的需要

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

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
@Html.ValidationSummary(true, "Unable to process the requested action:")
编辑

如果您不想重定向到错误页面并停留在第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
如果没有,请添加以下行

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

这是一个很好的答案。我没有使用ActionFilters,所以这个回复会刺激我以后有一个goosey。谢谢,我同意。这是最好的方法,但它不是我最终使用的方法。不管怎样,我认为这是“答案”。谢谢。对于错误消息,不要忘记那些大的、友好的字母:你能不能先检查权限,然后不显示编辑链接?如果他们不能编辑,为什么要让他们看到它?根本不显示编辑链接是不可能的。在已放置“编辑”按钮的视图中,存在用户可以/不能编辑的不同项目的列表。在选择每个项目后,我们需要确定他是否可以编辑。理想情况下,我们会基于此禁用/启用“编辑”按钮,但由于这需要回拨控制器,因此我们仅将其保存为用户实际单击“编辑”按钮时使用。理想情况下,我希望避免将用户重定向到错误页。抱歉,误解了原始问题。