我正在使用Google的re-captcha v2,并且Google的Javascript在运行时会动态生成一个带有键g-recaptcha-response
的form参数。标记是这样的:
<form method="post">
<div class="g-recaptcha" data-sitekey="6LcXjGYUAAAAA...g1UKiZ"></div>
<input type="submit" id="submit" value="Enter" />
</form>
<script src='https://www.google.com/recaptcha/api.js'></script>
您会注意到没有名称为<input>
的{{1}}元素,因为它是由Javascript动态生成的。 (注意:以上内容对您不起作用,因为页面网址必须与使用g-recaptcha-response
在Google上配置的内容相匹配。)
点击提交后,请求正文如下:
data-sitekey
我不知道如何在这种情况下使用模型。因此,我尝试使用以下代码直接读取请求正文:
g-recaptcha-response=03AEMEkE....nLXmlhwEE&__RequestVerificationToken=CfDJ8Oe....93pb
public async Task<IActionResult> OnPostAsync()
{
String result;
using (StreamReader reader = new StreamReader(Request.Body)) {
result = await reader.ReadToEndAsync();
return RedirectToPage("/test");
}
}
始终是一个空字符串,即使我发现检查Http流中也有数据。上面的代码有什么错误吗?它可以编译并正确运行。
或者是否有内置的类或方法可以将发布数据返回到Json中?
答案 0 :(得分:1)
...是否有内置类或方法可以返回张贴数据,例如Json?
您的示例是发布表单url编码的数据。内置的[FromForm]
属性可以将其绑定到Dictionary<string, string>
模型。 Newtonsoft可以将该模型转换为JSON以供服务器端使用,而JsonResult
可以将该模型转换为JSON以供客户端使用。
[HttpPost]
public IActionResult Post([FromForm] Dictionary<string,string> model)
{
// convert to JSON
var json = Newtonsoft.Json.JsonConvert
.SerializeObject(model, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(json);
// return JSON
return new JsonResult(model);
}
如果我们收到这样的帖子...
POST http://localhost:5000/api/values HTTP/1.1
User-Agent: Fiddler
Host: localhost:5000
Content-Length: 85
Content-Type: application/x-www-form-urlencoded
g-recaptcha-response=03AEMEkE....nLXmlhwEE&__RequestVerificationToken=CfDJ8Oe....93pb
...然后我们将看到以下控制台输出。
{
"g-recaptcha-response": "03AEMEkE....nLXmlhwEE",
"__RequestVerificationToken": "CfDJ8Oe....93pb"
}