.net core 在dotnet core 2.0中,远程验证模型绑定在razor页面上不起作用

.net core 在dotnet core 2.0中,远程验证模型绑定在razor页面上不起作用,.net-core,asp.net-core-2.0,razor-pages,.net Core,Asp.net Core 2.0,Razor Pages,我在razor页面中有一个表单,其中有一个字段具有远程验证 . . . <div class="form-group"> <label class="control-label" asp-for="ReportViewModel.ExecSql"></label> <textarea class="form-control" asp-for="ReportViewModel.ExecSql" ></te

我在razor页面中有一个表单,其中有一个字段具有远程验证

. . .
    <div class="form-group">
        <label class="control-label" asp-for="ReportViewModel.ExecSql"></label>
        <textarea class="form-control" asp-for="ReportViewModel.ExecSql" ></textarea>
        <span asp-validation-for="ReportViewModel.ExecSql" class="text-danger"></span>
    </div>
. . .
要调用以下操作:

[AcceptVerbs("Post")]
public IActionResult VerifySql(string ExecSql)
{
   if (!Repository.VerifySql(ExecSql))
      return Json("Sql is not valid (Select statements only are allowed)");

    return Json(data: true);
}
razor页面的cs文件:

public class AddReportModel : PageModel
    {
        private readonly IIntegrityReportRepository _repository;
        private readonly IMapper _mapper;

        public AddReportModel(IIntegrityReportRepository repository, IMapper mapper)
        {
            _repository = repository;
            _mapper = mapper;
        }

        [TempData]
        public string ConfirmationMessage { get; set; }

        [BindProperty]
        public IntegrityReportViewModel ReportViewModel { get; set; }
. . .
这将调用操作,但ExecSql始终为null。这是因为当我查看请求时,表单正在发布。。ReportViewModel.ExecSql。我无法从我的VerifySql操作方法中获取

我已尝试向cshtml字段添加名称:

<textarea class="form-control" asp-for="ReportViewModel.ExecSql" name="ExecSql" ></textarea>
然后将cshtml更改为:

<div class="form-group">
    <label class="control-label" asp-for="ExecSqlField"></label>
    <textarea class="form-control" asp-for="ExecSqlField"></textarea>
    <span asp-validation-for="ExecSqlField" class="text-danger"></span>
</div>

然而,这感觉是错误的,然后我复制了viewmodel,我需要在其他页面上共享它。通过某种方式让Verify操作方法访问ReportViewModel.ExecSql,是否可以在我的操作方法中拾取原始viewmodel中的字段


非常感谢您提供的帮助

在我撞了很多脑袋之后,我找到了一个解决办法。虽然不是最优雅的,但它现在正在发挥作用

只需将[Bind(Prefix=“ReportViewModel.ExecSql”)]添加到验证方法参数中


您可以恢复更改并使用“Model.Field”表单模式继续。

只想添加@Baseless和@Breno的答案是正确的

我的财产是:

        [Display(Name = "Access Code")]
        [Remote("CheckForGroup", "Users", "Admin", HttpMethod = "Post")]
        public string AccessCode { get; set; }
只有当我把这个添加到我的控制器时,它才起作用:

    public IActionResult CheckForGroup([Bind(Prefix = "Input.AccessCode")] string accessCode)

谢谢你们

我也注意到了同样的问题,但我自己还没有找到令人满意的答案。应该补充的是,您可以在远程端的参数上使用[Bind(Prefix=“ReportViewModel”)]。但由于antiforgerytoken也带有前缀,因此无法通过注释验证antiforgery(这意味着必须在2.1中主动禁用它)。以此类推,这不是一个好的选择。但是,既然您的远程调用中似乎没有包含antiforgerytoken,那么这可能就足够了?
        [Display(Name = "Access Code")]
        [Remote("CheckForGroup", "Users", "Admin", HttpMethod = "Post")]
        public string AccessCode { get; set; }
    public IActionResult CheckForGroup([Bind(Prefix = "Input.AccessCode")] string accessCode)