MVC использует Action Filter для проверки параметров в URL. остановить действие от выполнения - PullRequest
4 голосов
/ 07 октября 2010

Я хочу сделать следующее:

когда URL не имеет instID, я хочу перенаправить на "Instelling" действие

в этом контроллере , каждый метод нуждается в instID.

        [RequiredParameter(parameterName="instID", controllerToSend="Instelling")]
        public ActionResult Index(int? instID) {
            //if (!instID.HasValue) {
            //    return RedirectToAction("Index", "Instelling");
            //}

            var facts = _db.Instellingens.First(q => q.Inst_ID == instID).FacturatieGegevens;

            return View(facts);
        }

так что это в контроллере.

фильтр действий:

namespace MVC2_NASTEST.Controllers {
    public class RequiredParameterAttribute : ActionFilterAttribute {

        public string parameterName { get; set; }
        public string actionToSend { get; set; }
        public string controllerToSend { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext) {

            if (parameterName != string.Empty) {
                if (filterContext.ActionParameters.ContainsKey(parameterName) && filterContext.ActionParameters[parameterName] != null) {
                    string s = "test";
                    //all is good
                } else {
                    //de parameter ontbreekt. kijk of de controller en de action geset zijn.
                    if (actionToSend == string.Empty)
                        actionToSend = "Index";
                    if (controllerToSend == string.Empty) {
                        controllerToSend = filterContext.Controller.ToString();
                        controllerToSend = controllerToSend.Substring(controllerToSend.LastIndexOf(".") + 1);
                        controllerToSend = controllerToSend.Substring(0, controllerToSend.LastIndexOf("Controller"));
                    }

                    UrlHelper helper = new UrlHelper(filterContext.RequestContext);
                    string url = helper.Action(actionToSend, controllerToSend);

                    HttpContext.Current.Response.Redirect(url);
                    //filterContext.HttpContext.Response.Redirect(url, true);
                }
            }

            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext) {


            base.OnActionExecuted(filterContext);
        }

    }
}

Дело в том, что оно работает, однако само действие сначала выполняется, ТОГДА происходит перенаправление. это не то, что я хотел.

Возможно, я не должен использовать actionfilters, а просто добавить маршрут? в этом случае, как мне перенаправить маршрут на другой контроллер, если instID отсутствует?

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Вместо создания фильтра действий (который запускается непосредственно перед возвратом метода действия), вы можете подумать о переходе на фильтр авторизации, который позволит вам перенаправить на альтернативный контроллер и действие

Что-то вродеэто (псевдокод):

public class RequiredParameterAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // read instID from QueryString
        // if instId is null, return false, otherwise true
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.result = new RedirectToRouteResult( new { controller = "MyController" , action = "MyAction" }  )
    }

}

2 голосов
/ 07 октября 2014

Это был первый результат по вопросу, который я задал в Google, поэтому я хотел бы предложить другой ответ. Вместо выполнения перенаправления из действия назначьте перенаправление для filterContext.Result, как это:

filterContext.Result = new RedirectResult(url);

Если свойство результата filterContext не равно нулю, то основное действие не будет выполнено. Поскольку вы выполняете перенаправление вне контекста вызова, вы все равно будете выполнять метод действия.

...