使用Umbraco Base返回Json而不是XML
本文关键字:XML Json Umbraco Base 返回 使用 | 更新日期: 2023-09-27 18:29:02
我有一个.NET方法,它向我的DB添加了一个新成员。它通过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
谢谢Robert
这里有一个很好的例子,说明如何使用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);
});
这个网站在帮助ASP.NET jQuery Ajax调用方面非常出色,这篇文章尤其是
Adrian Iftode的回答是正确的,但您不需要在服务器上设置响应格式。如果您请求JSON,服务器将自动对此进行编码。如果您有多个服务调用Web服务,并且需要对它们进行不同的编码,那么这很方便。
$.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);
您可能需要修饰方法以返回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()
})..
终于想通了!
我需要将"returnXml=false"添加到我的一个类调用中。