我在带有远程验证的字段的剃须刀页面中有一个表单。
. . .
<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"表单模式恢复更改并恢复。