如何使用javascript正确格式化服务器端传递的参数?
我不知道如何让下面的代码在我的小演示ASP.NET应用程序中工作,我希望这里的人能提供帮助 下面是javascript:如何使用javascript正确格式化服务器端传递的参数?,javascript,c#,asp.net,ajax,xmlhttprequest,Javascript,C#,Asp.net,Ajax,Xmlhttprequest,我不知道如何让下面的代码在我的小演示ASP.NET应用程序中工作,我希望这里的人能提供帮助 下面是javascript: function checkUserName() { var request = createRequest(); if (request == null) { alert("Unable to create request."); } else { var theName = document.getElementBy
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);
}
}
以下是my*.aspx.cs类中的方法:
[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
---------------------------
我开始搜索,然后继续搜索几个线程,尝试了很多引号和键值对的组合,但我尝试的都没有成功
当我从C#方法和request.send()中删除参数时,我会在JS回调中得到一个可以处理的响应。但只要我尝试使用参数做一些事情,就会得到上面的异常。如果可能的话,我想知道在不使用jQuery的情况下如何做到这一点
提前谢谢
最终版本
根据阿列克谢的建议,我最终得出以下结论,这是可行的。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();
}
}
这对“GET”不起作用。试一试
这对“GET”不起作用。试一试
正如艾伦所说,使用POST方法。或者在打开URL之前将参数传递到URL中,例如
var url = "Default.aspx/CheckName?userName=" + values;
编辑:不,这可能是个坏主意,因为你想发送JSON,忘记我说的。就像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
,您需要:
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请求,您需要所有参数都位于Url中(并且主体为空),对于POST,您可以同时使用这两个参数。截至当前代码,您希望获得,但正在发送POST
- 正确添加查询参数-名称和编码值
是可选的JavaScript函数,有关详细信息,请参阅encodeUriComponent
- 如果使用POST,您还需要正确编码参数,并指定正确的“内容类型”标题
- 如果发送JSON,则需要在服务器端解码JSON
jQuery.ajax
为您完成了大部分工作,如果您想自己完成所有工作,您需要查看好的源代码。您需要:
- 决定你想得到还是邮寄。对于GET请求,您需要所有参数都位于Url中(并且主体为空),对于POST,您可以同时使用这两个参数。截至当前代码,您希望获得,但正在发送POST
- 正确添加查询参数-名称和编码值
是可选的JavaScript函数,有关详细信息,请参阅encodeUriComponent
- 如果使用POST,您还需要正确编码参数,并指定正确的“内容类型”标题
- 如果发送JSON,则需要在服务器端解码JSON
旁注:
jQuery.ajax
为您完成了大部分工作,如果您想自己完成所有工作,那么您需要查看好的源代码。如果您需要发布帖子,那么您需要像这样发送它
var values=JSON.stringify({“用户名”:“+userName+”})代码>
你必须将HttpGet
更改为HttpPost
,如果你需要使用POST,那么你需要像这样发送它
var values=JSON.stringify({“用户名”:“+userName+”})代码>
您必须将HttpGet
更改为HttpPost
如果您发现您的答案是错误的,最好将其删除。我不需要发送JSON。这只是我试图弄明白这一点时遇到的建议之一。将参数粘贴到URL中也不起作用。服务器端方法似乎没有被击中。如果您发现答案是错误的,最好将其删除。我不需要发送JSON。这只是我试图弄明白这一点时遇到的建议之一。将参数粘贴到URL中也不起作用。服务器端方法似乎没有受到影响。感谢您的快速响应,但我尝试在没有ASP.NET MVC的情况下执行此操作,它使用的是ASP.NET MVC,对吗?@RobC这也应该在没有MVC的情况下工作。您只需使用不带值的send()
,并将值放入url中。旁注:此Razor视图不应适用于大多数url,因为@
将对该值进行Html编码,从而产生与OP几乎相同的结果。在MVC中正确创建JavaScript的url在很多帖子中都有介绍,在JavaScript中正确创建url(比如@ShaunLuttin I应该更精确一些——确切地说,代码会工作得很好,因为它有url.Action
硬编码的所有参数,只要您开始使用更多的数据,比如…Action=“CheckName”,新的{Previous=lastEnteredUserNameWithAmpersand})
一个人会遇到麻烦。。。因此,一般来说,最好总是正确地为JavaScript编写URL…感谢您的快速响应,但我尝试在没有ASP.NET MVC的情况下完成这项工作,这是它使用的,对吗?@RobC这也应该在没有MVC的情况下工作。您只需使用不带值的send()
,并将值放入url中。旁注:此Razor视图不应适用于大多数url,因为@
将对该值进行Html编码,从而产生与OP几乎相同的结果。在MVC中正确创建JavaScript的url在很多帖子中都有介绍,在JavaScript中正确创建url(比如@ShaunLuttin I应该更精确些——确切地说,只要您开始使用一些mo,代码就可以很好地工作,因为它具有url.Action
硬编码的所有参数