2010-01-15 4 views
5

J'ouvre une boîte de dialogue jQuery, dans cette case je fais une sauvegarde/annulation. Pour enregistrer, j'appelle mon contrôleur, effectue une validation, sauvegarde ou lance Exception (MyPersonalException). S'il y a une exception, je retourne une autre vue (la vue "MessageError") à afficher dans le popup. Je veux juste voir dans la boîte modale message disponible dans « MyPersonalException »Message d'exception à l'interface utilisateur

Mes questions: 1. C'est un travail mais seulement avec Firefox ne IE pas Chrome 2. Y at-il une autre façon parce que regardons un lof de code pour simplement afficher un message.

Le regard du contrôleur comme ceci:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult SaveOrUpdate(Guid id, string firstName, string LastName) 
{ 
    try 
    { 
     Employee employee = new Employee() { Id = id, FirstName = firstName, LastName = LastName }; 
     _employeeService.SaveOrUpdate(employee); 
     return Index(); 
    } 
    catch (MyPersonalException ex) 
    { 
     _model.ErrorMessage = ex.Message; 
     return View("MessageError", _model); 

    } 
    catch (Exception ex) 
    { 
     _model.ErrorMessage = ex.Message; 
     return View("MessageError", _model); 
    } 
} 

Pour appeler la boîte de dialogue, j'utilise ce code

jQuery (document) .ready (function() { $ (function() { /* var name = $ ("# firstName"), email = $ ("#nom"), password = $ ("# isActive"), allFields = $ ([]) .add (nom) .add (email) .add (mot de passe), tips = $ ("# validateTips"); */

$("#dialog").dialog({ 
     bgiframe: true, 
     autoOpen: false, 
     modal: true, 
     buttons: { 
      Save: function() { 
       $.ajax({ 
        type: "POST", 
        url: "/Employee/SaveOrUpdate", 
        data: { 
         id: getId(), 
         firstName: getFirstName(), 
         lastName: getLastName() 
        }, 
        success: function(data) { 
         if (jqueryShowResult(data)) 
          $("#DisplayError").html(data); 
         else { 
          employeeId = 0; 
          $(this).dialog('close');        
         } 
        }, 
        error: function(XMLHttpRequest, textStatus, errorThrown) { 
        } 
       }) 

      }, 
      Cancel: function() { 
       employeeId = 0; 
       $(this).dialog('close'); 
      } 
     }, 
     close: function() { 
      $("#gridEmpoyee").trigger("reloadGrid"); 
     }, 
     open: function() { 
      $.ajax({ 
       type: "POST", 
       url: "/Employee/GetEmployee", 
       data: { 
        id: employeeId 
       }, 
       success: function(data) { 
        $("#employeeDetail").html(data); 
       }, 
       error: function(XMLHttpRequest, textStatus, errorThrown) { 
       } 
      }) 
     } 
    }); 
}); 

});

Le jQueryShowResult

<script type="text/javascript"> 
    jqueryShowResult = function(msg) { 
     var browser; 
     try //Internet Explorer 
        { 
      xmlDocTest = new ActiveXObject("Microsoft.XMLDOM"); 
      browser = "IE"; 
     } 
     catch (e) { 
      browser = "FF"; 
     } 

     if (browser == "IE") { 
      try { 
       xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
       xmlDoc.async = "false"; 
       xmlDoc.loadXML(msg); 
       var message = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue; 
       var code = xmlDoc.getElementsByTagName("code")[0].childNodes[0].nodeValue; 

       return false; 
      } 
      catch (e) { 
       return true; 
      } 
     } 
     else { 

      var code = $(msg).find('code').text(); 
      var message = $(msg).find('message').text(); 
      if (code == "500") { 
       return false; 
      } 
      else { 
       return true; 
      } 
     } 
    }; 
</script> 
+0

J'ai mis à jour la réponse ci-dessous, cela devrait vous permettre de faire ce que vous voulez sans personnaliser l'objet jQuery ajax. –

Répondre

2

Mise à jour: Désolé, nous utilisons un emballage personnalisé. Par défaut, jQuery n'inclut pas xmlHttpRequest en cas de succès. Voici une autre approche, cela fonctionne sans changer votre vue du tout. Vous êtes simplement en train de vérifier l'élément avec id='code' dans la réponse, s'il existe, affichez l'erreur.

success: function(data, textStatus) { 
    if ($("#code",data).length) { //See if the element <whatever id='code'> exists 
    $("#DisplayError").html(data); 
    } else { 
    employeeId = 0; 
    $(this).dialog('close');        
    } 
}, 

est ici la version jQuery 1.4 (voir changes here, notez le rappel Le succès reçoit objet XHR comme troisième argument):

Tout d'abord, définissez le StatusCode à 210 dans votre vue context.HttpContext.Response.StatusCode = 210;, utilisez ce rappel format:

success: function(data, textStatus, xhr) { 
    if (xhr.status == 210) { 
    $("#DisplayError").html(data); 
    } else { 
    employeeId = 0; 
    $(this).dialog('close');        
    } 
}, 
+0

Je reçois une erreur: "xhr undifined" –

+0

Puis-je encore utiliser le "jqueryShowResult"? Est-ce que ça marche sur FF, IE, Chrome? –

+0

Pas besoin de 'jQueryShowResult' avec cette solution, cela devrait fonctionner dans tous les navigateurs, vous cherchez simplement un élément avec' id = 'code'' strictement dans le résultat ajax, c'est ce que ', data' fait sur le sélecteur. –

Questions connexes