我在剃刀页面中有一个表单,其中包含一个具有远程验证的字段。
. . .
<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来在我的操作方法中获取原始视图模型中的字段?
非常感谢您的帮助
答案 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)
谢谢你们!