如何在不带窗体的情况下从$.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() {})
这方面没有错误报告,在序列化复杂参数时使用的类似方法确实有效。
不知道如何排除故障。
我建议您将键值对对象作为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)有一些限制,比如它不能根据你使用的标记从表单中序列化一些字段。