如何在不带窗体的情况下从$.post(..)方法传递guid或字符串

本文关键字:方法 字符串 guid post 窗体 情况下 | 更新日期: 2023-09-27 18:29:45

我有以下方法。

[HttpPost]
public void DoStuff(string input) { ... }

以下脚本的调用到达方法,但输入参数为null。我测试了以下所有变体,每次都有相同的结果。

$.post("/DoStuff", "{input=bbbd861b-62ae-4eb5-9677-3aa2e354c583}", function() {})
$.post("/DoStuff", "{input:bbbd861b-62ae-4eb5-9677-3aa2e354c583}", function() {})
$.post("/DoStuff", "{bbbd861b-62ae-4eb5-9677-3aa2e354c583}", function() {})
$.post("/DoStuff", "bbbd861b-62ae-4eb5-9677-3aa2e354c583", function() {})

这方面没有错误报告,在序列化复杂参数时使用的类似方法确实有效。

不知道如何排除故障。

如何在不带窗体的情况下从$.post(..)方法传递guid或字符串

我建议您将键值对对象作为json:传递

var param = JSON.stringify({guid: 'bbbd861b-62ae-4eb5-9677-3aa2e354c583'});
$.post("/DoStuff", param, function() { ... }, 'json');

注意最后一个参数'json'

属性名称必须反映参数名称(guid)。如果参数名称为id,则属性名称必须为id。这适用于所有类型。MVC以一种不区分大小写的方式工作(至少对MVC4来说是这样),顺便说一句,这很酷。

这样,框架将尝试将您的参数解析为您声明的类型。

我认为guid是有效的;如果该值不是有效的guid,则框架将无法正确解析它。为了进行测试,请确保Guid.Parse("bbbd861b-62ae-4eb5-9677-3aa2e354c583")将返回一个对象Guid

如果声明DoStuff(string input) { },则按如下方式传递键值对:

var param = JSON.stringify({input: 'bbbd861b-62ae-4eb5-9677-3aa2e354c583'});
$.post("/DoStuff", param, function() { ... }, 'json'); //json dataType

DoStuff中,可以使用Guid.Parse(input)将其解析为Guid

您可以在此处使用JQuery读取POST方法。

你可以最容易地传递很多这样的变量:

$.post( "/DoStuff", {input : "bbbd861b-62ae-4eb5-9677-3aa2e354c583" })
 .done(function( data ) {
   alert( "Data Loaded: " + data );
});

如果你有一个功能:

function doStuff(myVarStringGuid){
    $.post( "/DoStuff", {input: myVarStringGuid})
     .done(function( data ) {
       alert( "Data Loaded: " + data );
    });
}

在你的PHP上,你可以得到这样的变量:

$guid= $_POST['input'];    // bbbd861b-62ae-4eb5-9677-3aa2e354c583

如果是C#,你可以得到这样的变量:

string guid = Request.Form["input"];

或者在codeBehind:上使用Webmethod

[WebMethod]
public static string DoStuff(string input)
{
    myInput = input;
}

但是,500错误是当服务器可以访问您的页面时。。。如果您的路线http://yourWebsite/DoStuff存在,这可能是因为您的对象没有正确序列化。

此外,对于使用JQuery发送表单,我使用插件ajaxForm。使用Ajax发送表单非常容易:(我们获得了很多时间^^)

<form id="myForm" action="DoStuff" method="post"> 
    <input type="text" name="input" /> 
    <input type="submit" value="Submit Comment" /> 
</form>
<script>
    $('#myForm').ajaxForm(function() { 
        alert("Guid was received ;-)"); 
    }); 
</script>

别忘了你可以使用浏览器开发工具来检查你的AJAX请求。。。

根据@phoenixx的评论,我将回答并通过观察添加一些额外的值。正确的帖子URL如下。(注意:单个字符串,参数名称-等号-参数值,没有大括号,没有括号,没有圆括号。)

$.post("/DoStuff", "input=bbbd861b-62ae-4eb5-9677-3aa2e354c583", function() { });

如果该方法位于目录结构中的正确位置并具有以下签名,则它将发出post。

[HttpPost]
public void DoStuff(string input) { ... }

我看到您引用了一个变量guid,我怀疑您正试图使用调用调用的DOM元素的属性在JavaScript中编写调用。如果是,请注意以下操作将不起作用。

var guid = event.target.attributes["id"];
// guid is: id="bbbd861b-62ae-4eb5-9677-3aa2e354c583"
// you need: "id=bbbd861b-62ae-4eb5-9677-3aa2e354c583"
$.post("/DoStuff", guid, function() { });

看到细微的差别了吗?这是一个棘手的陷阱,很容易混淆。您需要像这样的属性的序列化版本。

var guid = event.target.attributes["id"];
$.post("/DoStuff", "id=" + guid.value, function() { });

错误显示500内部服务器错误。因此,在某个地方,服务器上的代码出现了故障,因为您可能没有正确地传递值,或者服务器代码本身有缺陷。当你这样做时,form.serialize(),它会产生一个(key:value)对的json结构。

例如,"name":"Konrad",在服务器端,您可以使用访问

字符串名称=request.getParameter("name");

但在其他情况下,您只传递值,而不是密钥。因此,上面的语句在请求中找不到参数"name"这是我可以从你的问题中了解到的,也许你可以调试你的服务器端代码以获得更好的清晰度。

您需要发送{"guid":"WHATEVER_YOUR_VALUE"}

如果你使用的是表单,那么使用serialize()总是更好的。但是serialize)有一些限制,比如它不能根据你使用的标记从表单中序列化一些字段。