2012-03-25 5 views
5

Ho un metodo .NET che aggiunge un nuovo membro al mio DB. Lo fa attraverso una richiesta AJAX. Ho questo funziona correttamente, tuttavia sto avendo problemi a restituire il messaggio di risposta corretta in modo che possa stampare i messaggi corretti all'utente.Restituzione di JSON anziché XML con Umbraco Base

mio metodo al momento si presenta così:

public static string MemberRegister(int process) 
    { 

     //here we find form values posted to the current page 
     HttpRequest post = HttpContext.Current.Request; 

     //get values from ajax URL 
     var name = post["name"]; 
     var email = post["email"]; 
     var username = post["username"]; 
     var password = post["password"]; 

     //check if email exists 
     if (Member.GetMemberFromEmail(email) == null) 
     { 

      MemberType userMemberType = new MemberType(1111); //id of membertype 'demo' 
      Member newMember = Member.MakeNew(name, userMemberType, new umbraco.BusinessLogic.User(0)); 

      newMember.AddGroup(MemberGroup.GetByName("Active").Id); 
      newMember.Email = email; 
      newMember.Password = password; 
      newMember.LoginName = username; 

      newMember.Save(); 

      return "success"; 
     } 
     else 
     { 
      return "emailError"; 
     }   

    } 

Il mio codice Ajax assomiglia:

 // submit 
    $registerForm.submit(function() { 

      $loader.show(); 

      jQuery.ajax({ 
       url: "/processform.aspx", 
       type: "POST", 
       data: $(this).serialize() 

      }).complete(function(response) { 

      alert(response.responseText); 

       if(response.responseText === "success") { 
        $registerSuccess.fadeIn(); 
       } elseif(response.responseText === "emailError") { 
        $registerEmailError.fadeIn(); 
       } else { 
        $registerError.slideDown();       
       } 

       $loader.hide(); 

      }); 



      return false; 

    }); 

Per esempio, se il membro tutti pronti esiste restituisce il reponse:

<value>emailError</value> 

Voglio solo che restituisca emailError non i tag di valore. Come faccio a fare questo?

Fiddler (Raw):

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Vary: Accept-Encoding 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Sun, 25 Mar 2012 20:59:54 GMT 
Content-Length: 25 

<value>emailError</value> 


    POST http://domain.com/base/Forms/MemberRegister/process.aspx HTTP/1.1 
    Host: domain.com 
    Connection: keep-alive 
    Content-Length: 125 
    Origin: http://domain.com 
    X-Requested-With: XMLHttpRequest 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 
    Content-Type: application/json; charset=UTF-8 
    Accept: application/json, text/javascript, */*; q=0.01 
    Referer: http://domain/register.aspx 
    Accept-Encoding: gzip,deflate,sdch 
    Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
    Cookie: ASP.NET_SessionId=ys4mmhsn2mpqcpja1iyjg04m; UMB_UPDCHK=1; __utma=256732567.15732944.1331581910.1332617890.1332627641.11; __utmc=256732567; __utmz=256732567.1331581910.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); UMB_UCONTEXT=12621b40-16fe-4422-a027-cf4fa68fe03d; __utma=176230262.1311679778.1332368941.1332694687.1332708163.12; __utmb=176230262.3.10.1332708163; __utmc=176230262; __utmz=176230262.1332368941.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) 

    __VIEWSTATE=%2FwEPDwUENTM4MWRkEytUM47m6NUA6dpfOudOh9t51j6okfG%2BQhu4Em%2B26KU%3D&name=ppp&email=ppp&username=ppp&username=ppp 

Grazie Robert

risposta

0

Potrebbe essere necessario per decorare il metodo per restituire JSON

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static string MemberRegister(int process) 


complete(function(response) { 
    if (response.d == "success") { 
    // 
    } 
} 

modificare

jQuery.ajax({ 
       url: "/processform.aspx", 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       data: $(this).serialize() 

      }).. 
+0

Ancora restituzione dei tag di valore. Qualche altro suggerimento? Qual è la differenza con reponse.d? – Robert

+1

quando viene restituito un JSON sembra {"d": "successo"} (Fiddler ti aiuterà a vedere la risposta esatta della richiesta) –

+0

Ok, posso vedere con il violinista che l'intestazione della risposta è simile, Content-Type: text/xml; charset = utf-8, quindi il suo XML che ritorna ancora. – Robert

-2

F inally capito!

Avevo bisogno di aggiungere "returnXml = false" a una delle mie chiamate di classe.

+2

Mostrate come avete fatto. –

+0

Come sopra, puoi fornire informazioni? Sono curioso. –

+0

In generale, quando trovi una soluzione a un particolare problema, è utile fornire anche una risposta completa. L'intero concetto è quello di condividere informazioni, non solo cercare di ottenerlo dagli altri. – Kris

3

This site è incredibile per aiutare con le chiamate ASP.NET Ajax jQuery, this post in particolare

Adrian Iftode è corretto con la sua risposta, ma non hanno bisogno di impostare un formato di risposta del server. Se si richiede JSON, il server codificherà automaticamente su quello. Questo è utile se hai più servizi che chiamano i servizi web e devi codificarli diversamente per loro.

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "WebService.asmx/WebMethodName", 
    data: "{}", 
    dataType: "json" 
}); 

ho anche trovato this post utile quando ho iniziato a fare questo. Fornisce un codice che sposta tutte le chiamate $ .ajax in un'unica posizione.

// *** Service Calling Proxy Class 
function serviceProxy(serviceUrl){ 
var _I = this; this.serviceUrl = serviceUrl;  
// *** Call a wrapped object 
    this.invoke = function(method,data,callback,error,bare) 
    { 
     // *** Convert input data into JSON - REQUIRES Json2.js 
     var json = JSON2.stringify(data); 
     // *** The service endpoint URL 
     var url = _I.serviceUrl + method; 
     $.ajax({ 
        url: url, 
        data: json, 
        type: "POST", 
        processData: false, 
        contentType: "application/json", 
        timeout: 10000, 
        dataType: "text", // not "json" we'll parse 
        success: 
        function(res) 
        { 
         if (!callback) return; 
         // *** Use json library so we can fix up MS AJAX dates 
         var result = JSON2.parse(res); 
         // *** Bare message IS result 
         if (bare) 
         { callback(result); return; } 
         // *** Wrapped message contains top level object node 
         // *** strip it off 
         for(var property in result) 
         { 
          callback(result[property]); 
          break; 
         } 
        }, 
        error: function(xhr) { 
         if (!error) return; 
         if (xhr.responseText) 
         { 
          var err = JSON2.parse(xhr.responseText); 
          if (err) 
           error(err); 
          else 
           error({ Message: "Unknown server error." }) 
         } 
         return; 
        } 
       }); 
     }} 
    // *** Create a static instance 
    var Proxy = new serviceProxy("JsonStockService.svc/"); 
    // *** Call the webservice 
    Proxy.invoke("GetStockQuote",{ symbol: symbol },function(result){...}, onPageError); 
9

Ecco un buon esempio di come restituire un oggetto JSON con Umbraco Base:

/* Be sure to add References to: 
* 
* umbraco.dll 
* System.Web.dll 
* System.Web.Extensions.dll 
*/ 

using System.Web; 
using System.Web.Script.Serialization; 

using umbraco.presentation.umbracobase; 

namespace CoB.Umb.Base.Example 
{ 
    [RestExtension("Example")] 
    public class Example 
    { 
     [RestExtensionMethod(returnXml = false, allowAll = true)] 
     public static void Get() 
     { 
      string json = ""; 

      var person = new 
      { 
       firstName = "John", 
       lastName = "Doe" 
      }; 

      json = new JavaScriptSerializer().Serialize(person); 

      HttpContext.Current.Response.ContentType = "application/json"; 
      HttpContext.Current.Response.Write(json); 
     } 
    } 
} 

E il javascript:

$.getJSON('/base/Example/Get', function (data) { 
    alert("Hey, " + data.firstName + " " + data.lastName); 
}); 
+1

nel mio 4.7.2 installare l'attributo non funziona nel file di classe, devo aggiungere agli restExtensions file di configurazione per farlo funzionare – dc2009

+0

Gli attributi RestExtension sono stati intorno dal [Umbraco 4.6] (http: // Snipplr com/view/45818/umbraco-juno-restextension-e-restextensionmethod-attributo /). Li uso su 4.7.2 bene. Funzionano anche nella [cartella app_code] (http://our.umbraco.org/forum/developers/api-questions/33286-Base-RestExtension-without-compiled-DLL-possible). Forse vi state perdendo un [di dipendenza] (http://our.umbraco.org/forum/developers/extending-umbraco/16512-base-adding-class-file-to-App_Code-not-working-What-gives) sul server? –

+0

Questo è un esempio veramente pulito e piacevole e ha funzionato perfettamente con me usando 4.7.2. Grazie mille per aver condiviso la tua grande soluzione. – m1m1k