asp.net 我在将远程验证应用到我的Razor页面时遇到问题

w1jd8yoj  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(121)

我已经看过4到5个不同的视频,两个页面和1个SO链接谈论Razor页面中的远程验证,但我没有从这些例子中得到一些东西。例如,在示例中,我看到他们正在使用重复电子邮件检查器的变体。这是一个简单的例子,我有点明白是怎么回事,但我还没有能够推断出我的项目
在我的站点中,我有一个包含FromProperty的ItemModel,它是一个位置。我正在核对输入框中的内容与已知地点的列表。我已经把它添加到我的页面。

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();

我试过在ItemModel类中的FromLocation属性之上放置,但都没有命中我的OnPostCheckLocation方法。我也试过其他几种方法,但我从来没有能够让它工作。这是我使用的远程页面属性

[PageRemote(ErrorMessage = "Invalid Location",
HttpMethod = "post",
PageHandler = "CheckLocation")]

最后,my _ValidationScriptsPartial.cshtml确实包含了jquery.validate和jquery.validate.unobtrusive。那么,有人可以帮助我了解远程页面属性应该去哪里,让我知道,如果有其他东西,我错过了吗?

sqxo8psd

sqxo8psd1#

都没有命中我的OnPostCheckLocation方法
您可以使用F12查看控制台中是否有任何错误消息。您可能会遇到400错误。因为在您的Remote Page属性中您错过了AdditionalFields:验证请求中应包含的其他字段的逗号分隔列表。AdditionalFields属性必须包含请求验证令牌,因为默认情况下在Razor Pages中进行请求验证。如果POST请求中不包含此字段,则请求将失败,并显示400 Bad Request状态代码。
Razor Pages远程验证要求要验证的属性必须是PageModel类的直接后代(即不是PageModel的子属性的属性,也称为“嵌套属性”)
尝试将PageRemote属性应用于剃刀页面中的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" />
   
}

结果:

相关问题