none
MVC: Ajax loader qui s’arrête trop tôt à cause d'un return JavaScript("window.location = '" + _url +"'"); RRS feed

  • Discussion générale

  • Bonjour,

    J'ai un formulaire Ajax.BeginForm dans ma vue avec l'option LoadingElementId = "loading", pour exécuter un loader.gif

    @using (Ajax.BeginForm("MessageError", new AjaxOptions
    {
        HttpMethod = "GET",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "error",
        LoadingElementId = "loading",
    }))
    {
        <div class="main">
            <div class="input-group">
                @Html.TextBoxFor(m => m.nissPat, new { autofocus = "autofocus", id = "inputNISS", @class = "form-control item", placeholder = "Veuillez encoder le numéro de registre national", autocomplete = "off", onfocus = "this.setSelectionRange(this.value.length, this.value.length);" })
                <div class="input-group-append">
                    <button class="btn btn-secondary" type="submit">
                        <i class="fa fa-id-card"></i>
                    </button>
                </div>
            </div>
            <div class="centrer">
                <img id="loading" src="~/Content/images/loader.gif" style="display: none; text-align:center" runat="server" alt="Chargement en cours..." />
            </div>
            <div id="error">
                @if (Model.Error != null)
                {
                    {
                        Html.RenderAction("MessageError", Model);
                    }
                }
    
            </div>
        </div>
    }

    Dans mon controleur j'ai donc l'action:

     public ActionResult MessageError(EpiUgBrokaModel Pat = null)
            {
                string _url = EpiUgBrokaModel.C_URL_UGBROKA_TEST;
                string _niss = Pat.nissPat;
                EpiUgBrokaModel _pat = new EpiUgBrokaModel();
                Erreur _erreur = new Erreur();
    
                if (_niss == string.Empty || _niss == null)
                {
                    _erreur.Id = 1037;
                }
                else if (_niss.Length < 15)
                {
                    _erreur.Id = 1035;
                }
                else
                {
                    Regex _digitsOnly = new Regex(@"[^\d]");
                    _niss = _digitsOnly.Replace(_niss, "");
                    if (EpiUgBrokaBusiness.IsValidNiss(_niss))
                    {
                        try
                        {
                            ServicesSoapClient _ugBroakaWS = new ServicesSoapClient();
                            RequestPatientPortalAccessTokenOnNationalNumberRequestBody _body = new RequestPatientPortalAccessTokenOnNationalNumberRequestBody();
    
                            _body.aNationalNumber = _niss;
                            _body.aNationalNumberType = NationalNumberType.One;
    
                            RequestPatientPortalAccessTokenOnNationalNumberRequest _nationalNumberRequest = new RequestPatientPortalAccessTokenOnNationalNumberRequest(_body);
    
                            System.Guid _token = _ugBroakaWS.RequestPatientPortalAccessTokenOnNationalNumber(_body.aNationalNumberType, _body.aNationalNumber);
                            _url += _token.ToString("D");
    
    
                            return JavaScript("window.location = '" + _url +"'");
                            //return JavaScript("window.open( '" + _url + "')");
                            //return JavaScript("window.location.replace('" +_url + "');");
                            //Response.RedirectPermanent(_url, true);
                            //return RedirectToAction("Index");
    
                        }
                        //Erreur UG quand le patient n'est pas connu d'UG
                        catch (System.ServiceModel.FaultException)
                        {
                            _erreur.Id = 1038;
                        }
                        catch (Exception _ex)
                        {
                            if (_ex.Message.ToString() != "Le thread a été abandonné.")//Tj l'erreur quand je fais appel au WCF
                            {
                                _erreur.Id = 1040;
                            }
                        }
                    }
                    else
                    {
                        _erreur.Id = 1036;
                    }
                }
                _erreur = EpiErrorBusiness.ErrorMessage(_erreur.Id);
                _pat.Error = _erreur;
                return PartialView("_ErrorMessagePartial", _pat);
    
            }
        }

    Si j'ai une erreur cela renvoie vers 

    return PartialView("_ErrorMessagePartial", _pat);

    mon loader fonctionne bien dans ce cas mais quand je n'ai pas d'erreur:

    mon loader se coupe trop tôt car il rend la main via

    return JavaScript("window.location = '" + _url +"'");

    Il se lance bien mais dès qu'il passe dans le retur il se coupe, c'est logique mais il faut bien 10 secondes avant que le nouveau site s'affiche alors que le loader n'est plus visible pendant ce temps.

    Comment faire pour que le loader soit visible jusqu'au moment où le second site"_url" s'affiche ? 

    PS: je suis obligé d'utiliser le 

    Ajax.BeginForm

    Pour afficher l'erreur sans recharger ma page

    D'avance merci 

    vendredi 14 décembre 2018 13:21