MVC-uitbreidingscontroller om ajax-bewuste omleidingsfunctionaliteit te hebben

Hallo, ik leer Ajax + MVC. Ik dacht dat het goed zou zijn voor de controller om ajax-aware redirect() automatisch te verwerken. Na wat spitten vond ik de code van deze link . De onderstaande code is volledig transparant voor de gebruiker, een gebruiker kan gewoon Redirect (someUrlString) bellen zonder zich zorgen te hoeven maken over het verschil tussen normale/ajax-oproepen. Maakt het heel netjes en cool.

public abstract class BaseController : System.Web.Mvc.Controller {
    //turn into ajax aware redirect
    protected override RedirectResult Redirect(string url) {
        return new AjaxAwareRedirectResult(url);
    }
}

en ...

public class AjaxAwareRedirectResult : RedirectResult {
    public AjaxAwareRedirectResult(string url) : base(url) { }
    public override void ExecuteResult(ControllerContext context) {
        if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) {
            string desturl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
            JavaScriptResult result = new JavaScriptResult() { 
                                      Script = "window.location='" + desturl + "';" };
            result.ExecuteResult(context);
        }
        else { base.ExecuteResult(context); }
    }
}

Het is echter niet compleet. Uitdaging is:

RedirectToRouteResult RedirectToAction(ActionResult result)

is er nog niet (erg handig, vooral voor T4MVC).

Omdat ik nog steeds nieuw voor MVC ben, heb ik het geprobeerd, maar ik heb niet genoeg kennis om voldoende te bedenken hoe ik dit zelf moet schrijven. Kan iemand van jullie mij alsjeblieft hierbij helpen? zodat ik het uit je code kan leren? Dank u zeer.

5

2 antwoord

Hier is de snelle, eenvoudige oplossing die ik gebruik voor Ajax bewuste omleiding in mijn project ..

  1. Create a class AjaxRedirectAttribute for action.

        public class AjaxRedirectAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                var result = filterContext.Result as RedirectResult;
                if (result != null && filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    string destinationUrl = UrlHelper.GenerateContentUrl(result.Url, filterContext.HttpContext);
                    filterContext.Result = new JavaScriptResult()
                    {
                        Script = "window.location = '" + destinationUrl + "';"
                    };
                }
            }
        }
    
  2. User this attribute as below to either redirect to other page or to return some result from action.

    [AjaxRedirect]
    public ActionResult MyAction(FormCollection frmcol)
    {
       //some code here
        if (UserId != 0)
        {
            return Redirect(this.Url.Action("Action", "Controller"));
        }
        else
        {
            return Content("Error message here.");
        }
    }
    
6
toegevoegd

Dit is een goede oplossing die werkt met MVC-uitzonderingsafhandeling voor Ajax-oproep (Ajax.BeginForm of jQuery.ajax).

Dus, zoals je weet is er een Application_Error in global.asax.cs-bestand. Kunt u mij laten weten hoe ik een ajax-aanroep hier moet behandelen met voor het "JavaScriptResult" -resultaat.

Ik gebruik "RedirectToRoute" om het te verwerken, maar in een deel van de code voegt het de html toe met de bestaande header. Mijn foutcontroller heeft geen lay-out (_Layout = null), maar geeft nog steeds kop- en voettekst weer.

Ik werk gewoon aan een frisse RedirectToRoute-oproep.

 Response.RedirectToRoute("Default", new {controller = "Error", action = "Error"});



protected void Application_Error(object sender, EventArgs e)
        {
            RouteValueDictionary routeDataCollection = HttpContext.Current.Request.RequestContext.RouteData.Values;
            if (null != routeDataCollection && routeDataCollection.Count()>1)
            {
                Server.ClearError();
                 Response.RedirectToRoute("Default", new { controller = "Error", action = "Error"});
             }
        }

Bedankt

Sagar

0
toegevoegd