简体   繁体   中英

asp.net mvc validate [HttpPost] ActionResult()

I need to implement a ActionFilterAttribute [POST] ActionResult() in the controller. The problem is that I try to “redirect” to a page if validation failed... But it does not work. Validation runs, but then returns to the ActionResult() next line and finally when the view is returned, only then “redirected” to the page listed in the validation. Ultimately what I need is to stop the ActionResult() statements and “redirect” to the page listed in the validation. I tried OnActionExecuting() and OnActionExecuted() but does not work any

I need to...

filterContext.HttpContext.Response.Redirect (loginUrl, true);

Run away, “redirecting” the page indicated

My code:

[HelperSomeValidations("")]
[HttpPost]
public ActionResult Create(Pais pais)
{
  try
  {
    PaisBLL.saveNew(pais);
  }
  catch (Exception ex) 
  {
    ViewBag.error = ex;
    return View(“Error”);
  }
  return RedirectToAction(“Index”);
}

public class HelperSomeValidations : ActionFilterAttribute
{

  public HelperSomeValidations(String permiso)
  {
    this.permiso = permiso;
  }

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var user = filterContext.HttpContext.Session["coco"];
    if (user == null) //validates if the user just login
    {
      //send them off to the login page
      var url = new UrlHelper(filterContext.RequestContext);
      var loginUrl = url.Content(“~/Usuario/Login”);
      filterContext.HttpContext.Response.Redirect(loginUrl, true);
    }
    else
    {
      if (permission != “”)
      {
        //does some validations with “permission”
      }
    }
 }

}

Thks!

I know this doesn't solve the problem you have posted but I feel it's a better solution. I would personally use an AuthoriseAttribute here instead as this is what it's designed todo.

public class Authorise : AuthorizeAttribute
{
    private readonly string _permissionSystemName;

    public Authorise()
    {
    }

    public Authorise(string permissionSystemName)
    {
        _permissionSystemName = permissionSystemName;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //DO some logic and return True or False based on whether they are allowed or not.

        return false;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(
                new
                {
                    area = filterContext.HttpContext.Request.RequestContext.RouteData.Values["area"],
                    controller = "Generic",
                    action = "PermissionDenied"
                })
            );
    }
}

Usage would be along the lines of:

[Authorise("SomePermissionName")]
public class MyController : Controller
{

}

无需调用filterContext.HttpContext.Response.Redirect(loginUrl, true) ,而是需要将filterContext.Result设置为RedirectResult

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM