C# 如何在页面上显示友好的错误消息并取消控制器操作
在视图“x”中,当用户单击“编辑项”时,呈现“编辑”页面的控制器操作也在检查用户对该页面的权限 我试图做的是检查这些权限,如果用户没有这些权限,我希望在该“X”视图上显示一条错误消息,并取消控制器操作 现在,我的代码如下所示: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
[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。谢谢,我同意。这是最好的方法,但它不是我最终使用的方法。不管怎样,我认为这是“答案”。谢谢。对于错误消息,不要忘记那些大的、友好的字母:你能不能先检查权限,然后不显示编辑链接?如果他们不能编辑,为什么要让他们看到它?根本不显示编辑链接是不可能的。在已放置“编辑”按钮的视图中,存在用户可以/不能编辑的不同项目的列表。在选择每个项目后,我们需要确定他是否可以编辑。理想情况下,我们会基于此禁用/启用“编辑”按钮,但由于这需要回拨控制器,因此我们仅将其保存为用户实际单击“编辑”按钮时使用。理想情况下,我希望避免将用户重定向到错误页。抱歉,误解了原始问题。