【问题标题】:How do I get a property at index using custom validation in ASP.NET Core?如何使用 ASP.NET Core 中的自定义验证在索引处获取属性?
【发布时间】:2019-11-04 02:57:24
【问题描述】:

我的 Razor 页面中有输入字段,这些字段是使用 foreach 循环加载的。例如:

@foreach (var item in Model.DataList.Where(p => p.SubmittedBy == user.SubmittedBy))
{
    <input asp-for="AllTable.RefNumber" name="@item.Id" class="form-control" placeholder="Comments (optional)">
}

AllTable 是 Model,RefNumber 是 Property

我还有一个自定义验证类,它使用以下方法验证文本框的值:

var refNumber = (string)validationContext.ObjectType.GetProperty(validationContext.MemberName).GetValue(validationContext.ObjectInstance, null);

目前,refNumber 为空。如何在保留唯一名称属性的同时验证字段?如果我删除唯一名称,它可以正常工作,但是当发生验证错误时,它会针对所有相同的字段显示,因为名称与 asp-for 相同。

谢谢,

【问题讨论】:

  • 需要澄清更广泛的表格范围。我很好奇为什么所有这些输入都会引用asp-for="AllTable.RefNumber"。澄清你实际上想要做什么,这样循环的上下文是已知的。
  • 能否也包含此表单绑定的模型。
  • 用于表格行数据,每一行有数据,下面有一个表格行。此表单包含 RefNumber 输入,当单击批准按钮时,会将数据与其他隐藏字段一起保存到数据库,但需要先检查单独的数据库以确保 ref 编号不存在。

标签: c# asp.net asp.net-core razor


【解决方案1】:

因为它是一个剃须刀页面,所以您将无法从 ObjectInstance 访问模型,因为我认为它目前不受支持,但传入的值将是您的列表对象。

    var myList = value as ApprovedList;
    var refNames = myList.Select(s => s.RefName);

此外,您从列表中添加输入的方式不允许它绑定到模型。应该是这样的。

    <input asp-for="AllTable[i].RefNumber" class="form-control" placeholder="Comments (optional)">

【讨论】:

  • +1 但我认为不需要第二行;您不妨只进行显式转换并获得相同的结果。我可能会执行隐式强制转换,如果它为 null,则返回 false,因为它不是您期望的对象,因此它无效。如果它不为空,则继续验证。
  • 如果我使用已定义列表的页面模型执行var model = validationContext.ObjectInstance as YourModel,它会返回 null。我应该对 RazorPage 模型做一些不同的事情吗?
  • 啊。我已经玩了一点剃刀页面,我放弃它们以使用通常的剃刀视图和视图模型的原因之一是因为无法在服务器端验证中访问模型,所以你不能做交叉-字段验证。我已经修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2019-04-01
相关资源
最近更新 更多