如何使用 javascript 正确格式化服务器端传递的参数?
How do i correctly format parameters passed server-side using javascript?
我不知道如何让下面的代码在我的小演示 ASP.NET 应用程序中工作,希望这里有人能提供帮助。
这里是 javascript:
function checkUserName() {
var request = createRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var theName = document.getElementById("username").value;
var userName = escape(theName);
var url = "Default.aspx/CheckName";
request.onreadystatechange = createStateChangeCallback(request);
request.open("GET", url, true);
request.setRequestHeader("Content-Type", "application/json");
//none of my attempts to set the 'values' parameter work
var values = //JSON.stringify({userName:"userName"}); //"{userName:'temp name'}"; //JSON.stringify({ "userName":userName });
request.send(values);
}
}
这是我*.aspx.cs中的方法class:
[WebMethod]
[ScriptMethod(UseHttpGet=true)]
public static string CheckName(string userName)
{
string s = "userName";
return s + " modified backstage";
}
运行此代码时,我收到此异常:
---------------------------
Message from webpage
---------------------------
{"Message":"Invalid web service call, missing value for parameter: \u0027userName\u0027.","StackTrace":" at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}
---------------------------
OK
---------------------------
我开始搜索 here,然后转到 SO 上的几个线程,尝试了引号和键值对的多种组合,但我尝试过的都没有用。
当我从 C# 方法和 request.send() 中删除参数时,我在我的 JS 回调中得到了一个我可以使用的响应。但是,一旦我尝试使用参数执行某些操作,就会出现上述异常。如果可能的话,我想知道如何在不使用 jQuery 的情况下做到这一点。
提前致谢。
最终版本
使用 Alexei 的建议,我最终得到了以下有效的方法。 URL 缺少参数值两端的撇号;这使通话无法接通。
function checkUserName() {
var request = createRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var theName = document.getElementById("username").value;
var userName = encodeURIComponent(theName);
var url = "Default.aspx/CheckName?name='" + theName + "'";
request.onreadystatechange = createStateChangeCallback(request);
request.open("GET", url, true);
request.setRequestHeader("Content-Type", "application/json");
request.send();
}
}
request.send(values);
这不适用于 "GET"。尝试
request.open("POST", url, true);
如Alan所说,使用POST方法。或者在打开 URL 之前在 URL 中传递你的参数,例如
var url = "Default.aspx/CheckName?userName=" + values;
编辑:不,这可能是个坏主意,因为你想发送 JSON,忘了我说的吧。
鉴于您的服务器端方法要求 GET
,您需要:
request.open("GET", url + "?username=" + userName, true);
request.send();
适合我的作品:
function checkUserName() {
var request = new XMLHttpRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var userName = "Shaun Luttin";
var url = '@Url.RouteUrl(new{ action="CheckName", controller="Home"})';
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE ) {
if(request.status == 200){
document.getElementById("myDiv").innerHTML = request.responseText;
}
else if(request.status == 400) {
alert('There was an error 400')
}
else {
alert('something else other than 200 was returned')
}
}
}
request.open("GET", url + "?username=" + userName, true);
request.send();
}
}
在服务器端:
[HttpGet]
public string CheckName(string userName)
{
return userName + " modified backstage";
}
您需要:
- 决定是要 GET 还是 POST。对于 GET 请求,您需要所有参数都在 Url 中(并且 body 为空),对于 POST 您可以同时使用两者。从当前代码开始,您期待 GET,但发送 POST.
- 正确添加查询参数 - 名称和编码值。
encodeUriComponent
是JavaScript选择的函数,详见Build URL from Form Fields with Javascript or jquery
- 如果使用 POST,您也需要在那里正确编码参数并指定正确的 "content-type" header.
- 如果发送 JSON 你需要解码 JSON 服务器端。
或者,您可以使用隐藏形式来执行 POST/GET,如 JavaScript post request like a form submit
中所述
旁注:jQuery.ajax
为您完成了大部分工作,如果您想自己完成所有工作,可以查看很好的资源。
如果你需要去POST,那么你需要这样发送。
var values = JSON.stringify({"'userName':'"+ userName+ "'"});
并且你必须将 HttpGet
更改为 HttpPost
我不知道如何让下面的代码在我的小演示 ASP.NET 应用程序中工作,希望这里有人能提供帮助。
这里是 javascript:
function checkUserName() {
var request = createRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var theName = document.getElementById("username").value;
var userName = escape(theName);
var url = "Default.aspx/CheckName";
request.onreadystatechange = createStateChangeCallback(request);
request.open("GET", url, true);
request.setRequestHeader("Content-Type", "application/json");
//none of my attempts to set the 'values' parameter work
var values = //JSON.stringify({userName:"userName"}); //"{userName:'temp name'}"; //JSON.stringify({ "userName":userName });
request.send(values);
}
}
这是我*.aspx.cs中的方法class:
[WebMethod]
[ScriptMethod(UseHttpGet=true)]
public static string CheckName(string userName)
{
string s = "userName";
return s + " modified backstage";
}
运行此代码时,我收到此异常:
---------------------------
Message from webpage
---------------------------
{"Message":"Invalid web service call, missing value for parameter: \u0027userName\u0027.","StackTrace":" at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}
---------------------------
OK
---------------------------
我开始搜索 here,然后转到 SO 上的几个线程,尝试了引号和键值对的多种组合,但我尝试过的都没有用。
当我从 C# 方法和 request.send() 中删除参数时,我在我的 JS 回调中得到了一个我可以使用的响应。但是,一旦我尝试使用参数执行某些操作,就会出现上述异常。如果可能的话,我想知道如何在不使用 jQuery 的情况下做到这一点。
提前致谢。
最终版本 使用 Alexei 的建议,我最终得到了以下有效的方法。 URL 缺少参数值两端的撇号;这使通话无法接通。
function checkUserName() {
var request = createRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var theName = document.getElementById("username").value;
var userName = encodeURIComponent(theName);
var url = "Default.aspx/CheckName?name='" + theName + "'";
request.onreadystatechange = createStateChangeCallback(request);
request.open("GET", url, true);
request.setRequestHeader("Content-Type", "application/json");
request.send();
}
}
request.send(values);
这不适用于 "GET"。尝试
request.open("POST", url, true);
如Alan所说,使用POST方法。或者在打开 URL 之前在 URL 中传递你的参数,例如
var url = "Default.aspx/CheckName?userName=" + values;
编辑:不,这可能是个坏主意,因为你想发送 JSON,忘了我说的吧。
鉴于您的服务器端方法要求 GET
,您需要:
request.open("GET", url + "?username=" + userName, true);
request.send();
适合我的作品:
function checkUserName() {
var request = new XMLHttpRequest();
if (request == null) {
alert("Unable to create request.");
} else {
var userName = "Shaun Luttin";
var url = '@Url.RouteUrl(new{ action="CheckName", controller="Home"})';
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE ) {
if(request.status == 200){
document.getElementById("myDiv").innerHTML = request.responseText;
}
else if(request.status == 400) {
alert('There was an error 400')
}
else {
alert('something else other than 200 was returned')
}
}
}
request.open("GET", url + "?username=" + userName, true);
request.send();
}
}
在服务器端:
[HttpGet]
public string CheckName(string userName)
{
return userName + " modified backstage";
}
您需要:
- 决定是要 GET 还是 POST。对于 GET 请求,您需要所有参数都在 Url 中(并且 body 为空),对于 POST 您可以同时使用两者。从当前代码开始,您期待 GET,但发送 POST.
- 正确添加查询参数 - 名称和编码值。
encodeUriComponent
是JavaScript选择的函数,详见Build URL from Form Fields with Javascript or jquery - 如果使用 POST,您也需要在那里正确编码参数并指定正确的 "content-type" header.
- 如果发送 JSON 你需要解码 JSON 服务器端。
或者,您可以使用隐藏形式来执行 POST/GET,如 JavaScript post request like a form submit
中所述旁注:jQuery.ajax
为您完成了大部分工作,如果您想自己完成所有工作,可以查看很好的资源。
如果你需要去POST,那么你需要这样发送。
var values = JSON.stringify({"'userName':'"+ userName+ "'"});
并且你必须将 HttpGet
更改为 HttpPost