我无法弄清楚如何在我的小型演示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类中的方法:
[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的情况下执行此操作。
提前致谢。
最终版本 使用阿列克谢的建议,我得到了以下结果,这是有效的。 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();
}
}
答案 0 :(得分:3)
request.send(values);
这不会与" GET"一起工作。尝试
request.open("POST", url, true);
答案 1 :(得分:2)
像Alan所说,使用POST方法。或者在打开它之前在你的URL中传递你的参数,例如
$scope.addClient = function(newClient) {
console.log(newClient);
if(!newClient.name ||!newClient.email) {
$rootScope.$emit('errorEvent',
{"message" : "You must enter some client name"}
);
};
...performing other functions...
}
编辑:不,这可能是一个坏主意,因为你想发送JSON,忘了我说的。
答案 2 :(得分:2)
你需要:
encodeUriComponent
是首选的JavaScript函数,有关详细信息,请参阅Build URL from Form Fields with Javascript or jquery 或者,您可以使用隐藏表单执行JavaScript post request like a form submit
中所述的POST / GET附注:jQuery.ajax
为您做了大部分工作,如果您想自己完成所有工作,可以通过良好的资源进行查看。
答案 3 :(得分:0)
鉴于您的服务器端方法要求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";
}
答案 4 :(得分:0)
如果您需要进行POST,那么您需要像这样发送它。
var values = JSON.stringify({"'userName':'"+ userName+ "'"});
您必须将HttpGet
更改为HttpPost