5 Stimmen

MVC mit Action Filter, um nach Parametern in der URL zu suchen. Stoppen Sie die Ausführung der Aktion

Ich möchte das Folgende machen:

wenn die Url keine instID hat, möchte ich auf die "Instelling" action

hierin Controller benötigt jede Methode die 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);
        }

Das ist also im Controller.

den Aktionsfilter:

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);
        }

    }
}

die Sache ist: es funktioniert, jedoch wird die Aktion selbst zuerst ausgeführt, DANN die Umleitung geschieht. dies ist nicht, was ich wollte.

Vielleicht sollte ich keine Aktionsfilter verwenden, sondern einfach eine Route hinzufügen? Wie würde ich in diesem Fall die Route zu einem anderen Controller umleiten, wenn die instID fehlt?

7voto

Clicktricity Punkte 4138

Anstatt einen Aktionsfilter zu erstellen (der kurz vor der Rückkehr der Aktionsmethode ausgeführt wird), könnten Sie einen Autorisierungsfilter in Erwägung ziehen, der es Ihnen ermöglicht, zu einem alternativen Controller und einer alternativen Aktion umzuleiten

Etwa so (Pseudo-Code):

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" }  )
    }

}

2voto

Evan Bosscher Punkte 21

Dies war das erste Ergebnis auf eine Frage, die ich bei Google gestellt habe, daher möchte ich eine andere Antwort vorschlagen. Anstatt die Umleitung aus der Aktion zu tun, weisen Sie eine Umleitung zum filterContext.Result wie folgt zu:

filterContext.Result = new RedirectResult(url);

Wenn die Eigenschaft result des filterContext nicht null ist, wird die zugrunde liegende Aktion nicht ausgeführt. Da Sie eine Umleitung außerhalb des Kontextes des Aufrufs durchführen, wird die Aktionsmethode dennoch ausgeführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X