远程验证模型绑定在Dotnet Core 2.0中的剃须刀页面上不起作用



我在带有远程验证的字段的剃须刀页面中有一个表单。

. . .
    <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>
. . .

ReportViewModel中的字段定义为:

. . . 
[Remote(action: "VerifySql", controller: "ReportService", HttpMethod = "POST")]
public string ExecSql { get; set; }

调用下面的操作:

[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);
}

剃须刀页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始终为空。这是因为当我查看请求时,表格正在发布.. reportViewModel.execsql。我无法从我的verifysql操作方法中捡起。

我尝试在CSHTML字段中添加名称:

<textarea class="form-control" asp-for="ReportViewModel.ExecSql" name="ExecSql" ></textarea>

然后,这确实绑定了字段并传递了值,但是当客户端验证传递后不起作用。

我可以通过定义CS剃须刀页面文件中的另一个字段,例如。

[Remote(action: "VerifySql", controller: "ReportService", HttpMethod = "POST")]
[BindProperty]
public string ExecSqlField { get; set; }

然后将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。无论如何,是否可以通过以某种方式获取验证操作方法来访问reportviewModel.execsql?

非常感谢您的任何帮助

只是想补充说@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)

谢谢你们!

afte敲打头很多,我找到了解决方法。不是最优雅的,但现在正在完成工作。

只需添加[bind(prefix =" reportviewmodel.execsql"(]到您的验证方法参数。

您可以使用" model.field"表单模式恢复更改并恢复。

最新更新