【问题标题】:Returning Json instead of XML with Umbraco Base使用 Umbraco Base 返回 Json 而不是 XML
【发布时间】:2012-03-25 15:18:11
【问题描述】:

我有一个 .NET 方法可以向我的数据库添加一个新成员。它通过 AJAX 请求执行此操作。我可以正常工作,但是在返回正确的响应消息时遇到问题,因此我可以将正确的消息打印给用户。

我现在的方法是这样的:

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

    }

我的 Ajax 代码如下所示:

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

    });

例如,如果成员已经就绪,则返回响应:

<value>emailError</value> 

我只希望它返回 emailError 而不是值标签。我该怎么做?

提琴手(原始):

 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

谢谢 罗伯特

【问题讨论】:

    标签: c# .net ajax response umbraco


    【解决方案1】:

    这是一个很好的例子,说明如何使用 Umbraco Base 返回 JSON 对象:

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

    还有 javascript:

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

    【讨论】:

    • 在我的 4.7.2 安装中,该属性在类文件中不起作用,我必须将其添加到 restExtensions 配置文件中才能使其工作
    • RestExtension 属性自 Umbraco 4.6 以来一直存在。我在 4.7.2 上使用它们就好了。他们甚至在app_code folder 工作。也许您在服务器上缺少dependency
    • 这是一个非常干净和漂亮的例子 - 使用 4.7.2 非常适合我。非常感谢您分享您的出色解决方案。
    • 你也可以只返回 json 而不是做任何 response.write(虽然内容类型可能是错误的:我得到的是“text/html”)。
    【解决方案2】:

    This site 非常适合帮助 ASP.NET jQuery Ajax 调用,尤其是this post

    Adrian Iftode 的回答是正确的,但您不需要在服务器上设置响应格式。如果您要求 JSON,服务器将自动对其进行编码。如果您有多个服务调用 Web 服务并且您需要为它们进行不同的编码,这会很方便。

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

    当我开始这样做时,我还发现 this post 很有帮助。它提供了一些代码,将所有 $.ajax 调用移到一个地方。

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

    【讨论】:

      【解决方案3】:

      您可能需要修饰方法以返回 Json

      [WebMethod]
      [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
       public static string MemberRegister(int process)
      
      
      complete(function( response ) {
         if (response.d == "success") {
           //
          }
      }
      

      编辑

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

      【讨论】:

      • 仍然返回值标签。还有其他建议吗?使用 reponse.d 有什么区别?
      • 当一个 JSON 返回时,它看起来像 {"d": "success"} (Fiddler 将帮助您查看请求的确切响应)
      • 好的,我可以用 fiddler 看到响应头看起来像,Content-Type: text/xml; charset=utf-8,因此它仍然返回 XML。
      • 你可以在这里发布回复吗?
      • 我已经为 jQuery 准备好了这些编辑。完整响应:HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 变化:接受编码服务器:Microsoft-IIS/7.5 X-Powered-By:ASP.NET 日期:2012 年 3 月 25 日星期日 18:18:00 GMT 内容长度:25
      【解决方案4】:

      终于明白了!

      我需要在我的一个类调用中添加“returnXml = false”。

      【讨论】:

      • 如上,您能提供信息吗?我很好奇。
      • 一般来说,当您找到特定问题的解决方案时,最好也提供完整的答案。整个概念是共享信息,而不仅仅是尝试从他人那里获取信息。
      • 如果有人需要这个,returnXml = False 进入 RestExtensionMethod 属性的构造函数。有关示例,请参见上面 Douglas Ludlow 的回答。
      猜你喜欢
      • 2011-07-16
      • 2014-07-11
      • 2016-07-16
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多