Kentico 如何读取自定义表单控件中的 POST 值
Kentico how to read a POST Value in a custom form control
我正在开发 Kentico 应用程序 V12(在将相同的代码部署到 12 到 7 的其他安装之后),我添加了一个新的表单控件。
在我的例子中,控件用于 Google Recaptcha V3 令牌(因此我不需要保存该值),所以这些是我的步骤:
- 我通过Kentico界面添加了新的表单控件
- 我在一个表单中添加了一个新字段来测试功能
- 我添加了 Javascript 部分来管理 recaptcha 验证
实际上我能够在客户端管理所有流程,我现在的目标是在保存数据之前验证令牌,所以我在我的 ascx 文件中添加了这段代码
public partial class CMSModules_ReCAPTCHA : FormEngineUserControl
{
private static string GOOGLE_RECAPTCHA_LIBRARY_URL = "https://www.google.com/recaptcha/api.js";
public override bool IsValid()
{
return this.Validate();
}
public override object Value
{
get
{
// How can I get the value?
}
set { }
}
private bool Validate()
{
// Here's the code to validate the token
}
}
如果我发送表单,我可以在检查器上看到令牌已发送,但是如果验证不成功,我如何在我的 ascx 文件中获取该值并收到错误消息?
我尝试使用 CMS.Helpers.ValidationHelper.GetString(Form.GetFieldValue("reCAPTCHA"))
但它不起作用。
reCAPTCHA 它是字段的名称,值作为 g-recaptcha-response 发送。
所以我们处理这个问题的方法是在前端文件 (.ascx) 上添加一个 HiddenField 控件,HiddenField 由 javascript 填充,您 运行 使用标准的 recaptcha 东西(正如你提到的)。然后在表单的回发中,HiddenField 具有您的值 属性 可以使用的标记值。
在formcontrol的.ascx上
<asp:HiddenField runat="server" ID="recaptchaToken" ClientIDMode="Static" />
然后在你的 .ascx.cs 文件中的 formcontrol
public override object Value
{
get
{
return recaptchaToken.Value;
}
set
{
recaptchaToken.Value = (string)value;
}
}
这样它就应该在您拥有表单控件的表单的回发中。
请记住,您的 JavaScript 也需要填充该值。喜欢:
document.getElementById('recaptchaToken').value = token; //the one from Google
您可能还必须处理验证。为此,我们覆盖 IsValid 成员并调用 Google 以使用令牌进行验证。肮脏的版本看起来像:
public override bool IsValid()
{
if (Value == null || String.IsNullOrEmpty(Value.ToString()))
return false;
var tokenResponse = Value.ToString();
// Clear for next time around
Value = "";
return ReCaptchaCheckPassed(GoogleSecretKey, tokenResponse);
}
public static bool ReCaptchaCheckPassed(string GoogleSecretKey, string RecaptchaResponse)
{
HttpClient httpClient = new HttpClient();
var res = httpClient.GetAsync($"https://www.google.com/recaptcha/api/siteverify?secret={googleSecretKey}&response={RecaptchaResponse}").Result;
if (res.StatusCode != HttpStatusCode.OK)
return false;
string JSONres = res.Content.ReadAsStringAsync().Result;
dynamic JSONdata = JObject.Parse(JSONres);
if (JSONdata.success != "true")
return false;
return true;
}
我正在开发 Kentico 应用程序 V12(在将相同的代码部署到 12 到 7 的其他安装之后),我添加了一个新的表单控件。 在我的例子中,控件用于 Google Recaptcha V3 令牌(因此我不需要保存该值),所以这些是我的步骤:
- 我通过Kentico界面添加了新的表单控件
- 我在一个表单中添加了一个新字段来测试功能
- 我添加了 Javascript 部分来管理 recaptcha 验证
实际上我能够在客户端管理所有流程,我现在的目标是在保存数据之前验证令牌,所以我在我的 ascx 文件中添加了这段代码
public partial class CMSModules_ReCAPTCHA : FormEngineUserControl
{
private static string GOOGLE_RECAPTCHA_LIBRARY_URL = "https://www.google.com/recaptcha/api.js";
public override bool IsValid()
{
return this.Validate();
}
public override object Value
{
get
{
// How can I get the value?
}
set { }
}
private bool Validate()
{
// Here's the code to validate the token
}
}
如果我发送表单,我可以在检查器上看到令牌已发送,但是如果验证不成功,我如何在我的 ascx 文件中获取该值并收到错误消息?
我尝试使用 CMS.Helpers.ValidationHelper.GetString(Form.GetFieldValue("reCAPTCHA"))
但它不起作用。
reCAPTCHA 它是字段的名称,值作为 g-recaptcha-response 发送。
所以我们处理这个问题的方法是在前端文件 (.ascx) 上添加一个 HiddenField 控件,HiddenField 由 javascript 填充,您 运行 使用标准的 recaptcha 东西(正如你提到的)。然后在表单的回发中,HiddenField 具有您的值 属性 可以使用的标记值。
在formcontrol的.ascx上
<asp:HiddenField runat="server" ID="recaptchaToken" ClientIDMode="Static" />
然后在你的 .ascx.cs 文件中的 formcontrol
public override object Value { get { return recaptchaToken.Value; } set { recaptchaToken.Value = (string)value; } }
这样它就应该在您拥有表单控件的表单的回发中。
请记住,您的 JavaScript 也需要填充该值。喜欢:
document.getElementById('recaptchaToken').value = token; //the one from Google
您可能还必须处理验证。为此,我们覆盖 IsValid 成员并调用 Google 以使用令牌进行验证。肮脏的版本看起来像:
public override bool IsValid()
{
if (Value == null || String.IsNullOrEmpty(Value.ToString()))
return false;
var tokenResponse = Value.ToString();
// Clear for next time around
Value = "";
return ReCaptchaCheckPassed(GoogleSecretKey, tokenResponse);
}
public static bool ReCaptchaCheckPassed(string GoogleSecretKey, string RecaptchaResponse)
{
HttpClient httpClient = new HttpClient();
var res = httpClient.GetAsync($"https://www.google.com/recaptcha/api/siteverify?secret={googleSecretKey}&response={RecaptchaResponse}").Result;
if (res.StatusCode != HttpStatusCode.OK)
return false;
string JSONres = res.Content.ReadAsStringAsync().Result;
dynamic JSONdata = JObject.Parse(JSONres);
if (JSONdata.success != "true")
return false;
return true;
}