我无法将远程验证应用于我的 Razor 页面

I am having trouble applying Remote Validation to my Razor Page

提问人:Buck Hicks 提问时间:10/6/2023 最后编辑:Qing GuoBuck Hicks 更新时间:10/6/2023 访问量:53

问:

我已经看过 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。那么,有人可以帮助我了解远程页面属性应该放在哪里,并让我知道我是否缺少其他内容吗?

asp.net asp.net-core razor-pages remote-validation

评论


答:

0赞 Qing Guo 10/6/2023 #1

两者都没有命中我的 OnPostCheckLocation 方法。

您可以使用在控制台中查看是否有任何错误消息。您可能会遇到 400 错误。因为在你的远程页面属性中,你错过了:一个逗号分隔的附加字段列表,这些字段应该包含在验证请求中。该属性必须包含请求验证令牌,因为默认情况下,请求验证在 Razor Pages 中进行。如果此字段未包含在 POST 请求中,则请求将失败,并显示 400 错误请求状态代码。F12AdditionalFieldsAdditionalFields

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" />
   
}

结果:

enter image description here