远程验证模型绑定无法在dotnet core 2.0

时间:2018-02-07 08:57:04

标签: .net-core asp.net-core-2.0 razor-pages

我在剃刀页面中有一个表单,其中包含一个具有远程验证的字段。

. . .
    <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始终为null。这是因为当我查看请求时,表单正在发布.. ReportViewModel.ExecSql。我无法从我的VerifySql操作方法中获取。

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

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

然后绑定字段并传递值,但客户端验证在传回时不起作用。

我可以通过在cs razor页面文件中定义ANOTHER字段来实现它,例如

[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来在我的操作方法中获取原始视图模型中的字段?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:3)

经常敲打头,我找到了一个解决方法。不是最优雅,但它现在正在完成工作。

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

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

答案 1 :(得分:3)

只想补充一点,@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)

谢谢你们!