2012-03-25 4 views
5

Ich habe eine .NET-Methode, die meiner DB ein neues Mitglied hinzufügt. Dies geschieht durch eine AJAX-Anfrage. Ich habe das funktioniert richtig, aber ich habe Probleme, die richtige Antwort Nachricht, so dass ich die richtigen Nachrichten an den Benutzer drucken kann.Zurückgeben von Json anstelle von XML mit Umbraco Base

Meine Methode zur Zeit wie folgt aussieht:

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"; 
     }   

    } 

Mein Ajax Code wie folgt aussieht:

 // 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; 

    }); 

Zum Beispiel, wenn das Mitglied alle bereit, existiert es die reponse zurück:

<value>emailError</value> 

Ich möchte nur E-MailError nicht die Wert-Tags als auch zurückgeben. Wie mache ich das?

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 

Dank Robert

Antwort

0

Unter Umständen müssen Sie die Methode dekorieren Json

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


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

bearbeiten

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

      }).. 
+0

immer noch den Wert Tags zurück. Irgendwelche anderen Vorschläge? Was ist der Unterschied bei der Verwendung von reponse.d? – Robert

+1

Wenn ein JSON zurückgegeben wird, sieht es aus wie {"d": "Erfolg"} (Fiddler wird Ihnen helfen, die genaue Antwort der Anfrage zu sehen) –

+0

Ok Ich kann mit Fiddler sehen, dass der Antwort-Header aussieht, Content-Type: Text/XML; charset = utf-8, daher gibt es immer noch XML zurück. – Robert

-2

F zurückzukehren fand es innerlich heraus!

Ich musste "ReturnXml = False" zu einem meiner Klassenaufrufe hinzufügen.

+2

Bitte zeigen Sie, wie Sie das gemacht haben. –

+0

Wie oben können Sie Informationen bereitstellen? Ich bin neugierig. –

+0

Wenn Sie eine Lösung für ein bestimmtes Problem finden, ist es im Allgemeinen auch eine gute Antwort. Das ganze Konzept besteht darin, Informationen zu teilen und nicht nur von anderen zu bekommen. – Kris

3

This site ist erstaunlich für mit ASP.NET jQuery Ajax Anrufe zu helfen, this post insbesondere

Adrian Iftode ist richtig mit seiner Antwort, aber Sie brauchen nicht ein Antwortformat auf dem Server festgelegt. Wenn Sie nach JSON fragen, wird der Server dies automatisch verschlüsseln. Dies ist praktisch, wenn Sie mehrere Dienste aufrufen und die Webservices anders codieren müssen.

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

Ich fand auch this post hilfreich, als ich anfing, dies zu tun. Es gibt einen Code, der alle $ .ajax-Aufrufe an einen Ort verschiebt.

// *** 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

Hier ist ein gutes Beispiel dafür, wie ein JSON-Objekt mit Umbraco Base zurück:

/* 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); 
     } 
    } 
} 

Und das javascript:

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

in meiner 4.7.2 Installation funktioniert das Attribut nicht in der Klassendatei, ich muss es zur restExtensions Konfigurationsdatei hinzufügen, damit es funktioniert – dc2009

+0

Die RestExtension Attribute gibt es seit [Umbraco 4.6] (http: // snipplr .com/view/45818/umbraco-juno-restextension-and-restextensionmethod-attribute /). Ich benutze sie am 4.7.2 ganz gut. Sie arbeiten sogar im Ordner [app_code] (http://our.umbraco.org/forum/developers/api-questions/33286-Base-RestExtension-without-compiled-DLL-possible). Vielleicht vermisst du eine [Abhängigkeit] (http://our.umbraco.org/forum/developers/extending-umbraco/16512-base-adding-class-file-to-App_Code-not-working-What-gives) auf dem Server? –

+0

Dies ist ein wirklich sauberes und schönes Beispiel - und funktionierte perfekt für mich mit 4.7.2. Vielen Dank für Ihre großartige Lösung. – m1m1k

Verwandte Themen