Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript正确格式化服务器端传递的参数?_Javascript_C#_Asp.net_Ajax_Xmlhttprequest - Fatal编程技术网

如何使用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

我不知道如何让下面的代码在我的小演示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);
    }
}
以下是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
  • 正确添加查询参数-名称和编码值
    encodeUriComponent
    是可选的JavaScript函数,有关详细信息,请参阅
  • 如果使用POST,您还需要正确编码参数,并指定正确的“内容类型”标题
  • 如果发送JSON,则需要在服务器端解码JSON
或者,您可以使用隐藏表单执行中所述的POST/GET

旁注:
jQuery.ajax
为您完成了大部分工作,如果您想自己完成所有工作,您需要查看好的源代码。

您需要:

  • 决定你想得到还是邮寄。对于GET请求,您需要所有参数都位于Url中(并且主体为空),对于POST,您可以同时使用这两个参数。截至当前代码,您希望获得,但正在发送POST
  • 正确添加查询参数-名称和编码值
    encodeUriComponent
    是可选的JavaScript函数,有关详细信息,请参阅
  • 如果使用POST,您还需要正确编码参数,并指定正确的“内容类型”标题
  • 如果发送JSON,则需要在服务器端解码JSON
或者,您可以使用隐藏表单执行中所述的POST/GET


旁注:
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
硬编码的所有参数