C# 使用Umbraco Base返回Json而不是XML

C# 使用Umbraco Base返回Json而不是XML,c#,.net,ajax,response,umbraco,C#,.net,Ajax,Response,Umbraco,我有一个.NET方法,可以向我的数据库添加一个新成员。它通过AJAX请求实现这一点。我有这个工作正常,但我有问题返回正确的响应消息,以便我可以打印正确的消息给用户 目前我的方法如下: public static string MemberRegister(int process) { //here we find form values posted to the current page HttpRequest post = HttpConte

我有一个.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;

    });
例如,如果成员all ready存在,则返回响应:

<value>emailError</value> 
电子邮件错误 我只想让它返回emailError,而不是值标签。我该怎么做

小提琴手(原始):

HTTP/1.1200正常
内容类型:text/xml;字符集=utf-8
改变:接受编码
服务器:Microsoft IIS/7.5
X-Powered-By:ASP.NET
日期:2012年3月25日星期日20:59:54 GMT
内容长度:25
电子邮件错误
邮递http://domain.com/base/Forms/MemberRegister/process.aspx HTTP/1.1
主持人:domain.com
连接:保持活力
内容长度:125
来源:http://domain.com
X-request-With:XMLHttpRequest
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/535.11(KHTML,如Gecko)Chrome/17.0.963.79 Safari/535.11
内容类型:application/json;字符集=UTF-8
接受:application/json,text/javascript,*/*;q=0.01
推荐人:http://domain/register.aspx
接受编码:gzip、deflate、sdch
接受语言:英语GB,英语US;q=0.8,en;q=0.6
接受字符集: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=(直接)| UTMCN=(直接)| utmcmd=(无);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=(直接)| utmccn=(直接)| utmcmd=(无)
__VIEWSTATE=%2WEPDWUENTM4MWRKEYTUM47M6NUA6DPFOUDOH9T51J6OKFG%2BQhu4Em%2B26KU%3D&name=ppp&email=ppp&username=ppp&username=ppp
谢谢
Robert

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

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


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


终于明白了

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

特别有助于ASP.NET jQuery Ajax调用

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

$.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: "WebService.asmx/WebMethodName",
  data: "{}",
  dataType: "json"
});
当我开始这样做的时候,我也觉得很有帮助。它给出了一些将所有$.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);

下面是一个使用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);
});

仍然返回值标记。还有其他建议吗?使用reponse.d有什么区别?当返回JSON时,它看起来像{“d”:“success”}(Fiddler将帮助您查看请求的确切响应)好的,我可以看到Fiddler的响应头看起来像,内容类型:text/xml;charset=utf-8,因此它仍然返回XML。您能在这里发布响应吗?我已经为jQuery做了所有编辑。完整响应:HTTP/1.1200ok内容类型:text/xml;charset=utf-8 Vary:Accept Encoding Server:Microsoft IIS/7.5 X-Powered-By:ASP.NET日期:Sun,2012年3月25日18:18:00 GMT内容长度:25在我的4.7.2安装中,该属性在类文件中不起作用,我必须将其添加到restExtensions配置文件以使其工作restExtensions属性从那时起就一直存在。我在4.7.2上使用它们很好。他们甚至在办公室工作。也许您在服务器上缺少了一个?这是一个非常干净、很好的示例—使用4.7.2对我来说非常有效。非常感谢您分享您伟大的解决方案。您也可以只返回json而不执行任何response.write(尽管内容类型可能错误:我得到的是“text/html”)。如上所述,您可以提供信息吗?我很好奇。一般来说,当你找到一个特定问题的解决方案时,最好也提供一个完整的答案。整个概念是共享信息,而不仅仅是从其他人那里获取信息。如果有人需要,RestExtensionMethod属性的构造函数中会出现
returnXml=False
。请参见上面道格拉斯·卢德洛的答案以获取示例。
/* 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);
        }
    }
}
$.getJSON('/base/Example/Get', function (data) {
    alert("Hey, " + data.firstName + " " + data.lastName);
});