2011-12-16 7 views
6

Si prega di tenere presente che sono piuttosto nuovo a come MVC, Json, jQuery, ecc. Funziona, quindi portami con me. Ho fatto Web Forms negli ultimi 5 anni ...Response.StatusDescription non viene inviato da JsonResult a jQuery

Sto lavorando alla convalida di un modulo all'interno di un popup modale che utilizza un metodo JsonResult per inviare i dati del modulo al server. I wish Avrei potuto semplicemente caricare una vista parziale in quel popup e averlo fatto, ma questa non è un'opzione.

In ogni caso, ho un codice che funzionava ieri, ma dopo aver fatto un pull/push con Git, qualcosa è andato storto con la mia convalida. Faccio alcune convalide di base con JavaScript regolare prima di passare qualsiasi cosa al server (campi obbligatori, tipi di dati corretti, ecc.), Ma alcune cose, come assicurarmi che il nome che l'utente digita sia unico, mi impone di andare fino in fondo alla logica del business.

Dopo aver esplorato Internet, ho scoperto che se si desidera che jQuery riconosca un errore da un JsonResult in una richiesta AJAX, è necessario inviare un codice di stato HTTP di natura errata. Sono abbastanza sicuro che possa essere un qualsiasi numero negli anni 400 o 500 e dovrebbe funzionare ... e lo fa ... fino a un certo punto.

Quello che vorrei fare è impostare il codice di stato e la descrizione dello stato utilizzando Response.StatusCode e Response.StatusDescription, quindi restituire il modello. JQuery riconoscerebbe un errore, quindi visualizzerà il messaggio di errore che ho impostato nella descrizione dello stato. Tutto ha funzionato alla grande.

Oggi, sembra che l'unica cosa che lo rende dal mio JsonResult nel mio controller al mio jQuery è il codice di stato. Ho rintracciato il C# e tutto sembra essere impostato correttamente, ma non riesco proprio ad estrarre quella Custom Status Description I set.

Ecco il codice che ho:

Il Modal Popup

<fieldset id="SmtpServer_QueueCreate_Div"> 
    @Form.HiddenID("SMTPServerId") 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.ServerName) 
     <br /> 
     <input type="text" class="textfield wide-box" id="ServerName" name="ServerName" title="The display name of the Server" /> 
     <br /> 
     <span id="ServerNameValidation" style="color:Red;" /> 
    </div> 
    <div class="editor-label"> 
     <span id="GeneralSMTPServerValidation" style="color:Red;" /> 
    </div> 
    <br /> 
    <p> 
     <button type="submit" class="button2" onclick="onEmail_SmtpServerQueueCreateSubmit();"> 
     Create SMTP Server</button> 
     <input id="btnCancelEmail_SmtpServerQueueCreate" type="button" value="Cancel" class="button" 
     onclick="Email_SmtpServerQueueCreateClose();" /> 
    </p> 
</fieldset> 

Il controller

[HttpPost] 
     public virtual JsonResult _QueueCreate(string serverName) 
     { 
      Email_SmtpServerModel model = new Email_SmtpServerModel(); 
      string errorMessage = ""; 
      try 
      { 
       Email_SmtpServer dbESS = new Email_SmtpServer(ConnectionString); 
       model.SMTPServerId = System.Guid.NewGuid(); 
       model.ServerName = serverName; 
       if (!dbESS.UniqueInsert(model, out errorMessage)) 
       { 
        return Json(model); 
       } 
      } 
      catch (Exception ex) 
      { 
       errorMessage = ex.Message; 
      } 
      Response.StatusCode = 500; 
      Response.StatusDescription = errorMessage; 

      return Json(model); 
     } 

Il jQuery Ajax Request

$.ajax({ 
      type: 'POST', 
      data: { ServerName: serverName }, 
      url: getBaseURL() + 'Email_SmtpServer/_QueueCreate/', 
      success: function (data) { onSuccess(data); }, 
      error: function (xhr, status, error) { 
       $('#GeneralSMTPServerValidation').html(error); 
      } 
     }); 

Come ho già detto, ieri, questo stava mostrando un messaggio piacevole all'utente che li informava che il nome inserito non era unico se esisteva. Ora, tutto quello che sto ottenendo è un messaggio "Errore interno del server" ... che è corretto, poiché è quello che sto mandando con me quando ho impostato il mio Codice di stato. Tuttavia, come ho detto, non visualizza più la descrizione dello stato personalizzata che invio.

Ho anche provato a impostarlo su un codice di stato inutilizzato per vedere se questo era il problema, ma semplicemente non mostra nulla perché non sa quale testo mostrare.

Chi lo sa? Forse c'è qualcosa che non va nel mio codice. Molto probabilmente è stato un cambiamento fatto da qualche altra parte, cosa potrebbe essere, non ne ho idea. Qualcuno ha qualche idea su cosa potrebbe andare storto?

Se hai bisogno di altro codice, cercherò di fornirlo.

Grazie!

risposta

10

Nella richiamata errore, provare a utilizzare

xhr.statusText 

Inoltre, se si sta utilizzando webserver di Visual Studio, non si può ottenere il testo di stato di nuovo. http://forums.asp.net/post/4180034.aspx

+0

Sai, questo potrebbe essere in realtà ... ma non so se posso verificarlo. Ugh ... soluzioni non verificabili. E ho dato a xhr.StatusText una prova ... lo stesso risultato. Ho visto quella soluzione in altri posti. Credo che avrei dovuto dire che l'ho provato. – user1059903

+1

Se non si ha accesso a un'installazione completa di IIS, provare IIS Express. http://www.microsoft.com/web/gallery/install.aspx?appid=IISExpress –

+1

Sì ... era così. Sembra che il VS Webserver locale non ami le descrizioni di stato personalizzate. Funziona come un fascino ora! Grazie! – user1059903

Problemi correlati