提问人:Buck Hicks 提问时间:10/6/2023 最后编辑:Qing GuoBuck Hicks 更新时间:10/6/2023 访问量:53
我无法将远程验证应用于我的 Razor 页面
I am having trouble applying Remote Validation to my Razor Page
问:
我已经看过 4 或 5 个不同的视频、两个页面和 1 个 SO 链接,讨论 Razor 页面中的远程验证,但我没有从这些示例中得到一些东西。例如,在示例中,我看到他们正在使用重复电子邮件检查器的变体。这是一个简单的例子,我有点明白发生了什么,但我无法将其推断到我的项目中
在我的网站中,我有一个 ItemModel,其中包含一个 FromProperty,这是一个位置。我正在尝试根据已知的位置列表检查该框中输入的内容。我已将其添加到我的页面。
public async Task<JsonResult> OnPostCheckLocation(string location)
{
LocationModel ValidLocation = await LocationModel.CreateAsync(location);
var check = ValidLocation.Location;
var valid = !check.Equals("XXX");
// "X" is just a placeholder for
// an invalid location
return new JsonResult(valid);
}
如果输入的位置与数据库中的任何内容不匹配,则 ValidLocation 将返回“XXX”。我需要做的下一件事是添加 Page Remote 属性,但我不清楚它在哪里。我尝试将 ItemModel 属性添加到页面模型中。
public ItemModel Item { get; set; } = new ItemModel();
我尝试将 FromLocation 属性放在 ItemModel 类的上方,但都没有击中我的 OnPostCheckLocation 方法。我还尝试了其他几件事,但我永远无法让它工作。这是我使用的远程页面属性
[PageRemote(ErrorMessage = "Invalid Location",
HttpMethod = "post",
PageHandler = "CheckLocation")]
最后,我的 _ValidationScriptsPartial.cshtml 确实包含 jquery.validate 和 jquery.validate.unobtrusive。那么,有人可以帮助我了解远程页面属性应该放在哪里,并让我知道我是否缺少其他内容吗?
答:
两者都没有命中我的 OnPostCheckLocation 方法。
您可以使用在控制台中查看是否有任何错误消息。您可能会遇到 400 错误。因为在你的远程页面属性中,你错过了:一个逗号分隔的附加字段列表,这些字段应该包含在验证请求中。该属性必须包含请求验证令牌,因为默认情况下,请求验证在 Razor Pages 中进行。如果此字段未包含在 POST 请求中,则请求将失败,并显示 400 错误请求状态代码。F12
AdditionalFields
AdditionalFields
Razor Pages 远程验证要求要验证的属性必须是 PageModel 类的直接后代(即不是 PageModel 的子属性的属性,也称为“嵌套属性”)
尝试将 PageRemote 属性应用于 razor 页面中的 location 属性,并在当前页面中设置页面处理程序方法:
[PageRemote(
ErrorMessage = "Invalid Location",
AdditionalFields = "__RequestVerificationToken",
HttpMethod = "post",
PageHandler = "CheckLocation"
)]
[BindProperty]
public string location { get; set; }
下面是一个工作演示,可以参考一下:
IndexModel.cshtml.cs
public class IndexModel : PageModel
{
[PageRemote(
ErrorMessage = "Invalid Location",
AdditionalFields = "__RequestVerificationToken",
HttpMethod = "post",
PageHandler = "CheckLocation"
)]
[BindProperty]
public string location { get; set; }
public async Task<JsonResult> OnPostCheckLocation(string location)
{
// LocationModel ValidLocation = await LocationModel.CreateAsync(location);
var check = "XXX"; //do your staff,just for test
var valid = !check.Equals("XXX");
// "X" is just a placeholder for
// an invalid location
return new JsonResult(valid);
}
}
IndexModel.cshtml:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<form method="post">
<input asp-for="location" />
<span asp-validation-for="location"></span><br>
<input type="submit" />
</form>
@section scripts{
<partial name="_ValidationScriptsPartial" />
}
结果:
评论