【发布时间】:2018-06-27 12:33:59
【问题描述】:
我有一个表单,用户可以根据需要添加任意多的行。每次他们都希望从提供的下拉列表中选择不同的选项。目前没有验证可以阻止他们多次选择相同的值。
每一行都是一个“ResourceCount”。 ViewModel 有一个 ResourceCountViewModel 的 IList,因此每一行都作为一个项目添加到列表中。
ResourceCount 视图模型由一个“id”(用于存储所选下拉值)和一个“quantity”(用于数字字段)组成。
我想不出在这种情况下使用 Compare 注释的方法。 我该如何为此实施适当的验证?
编辑: 接受的答案中有很多好的建议。我在控制器发布操作中进行了简单的检查:
if (resourceCounts.Count != resourceCounts.Where(d => d.Id!= 0)
.Select(x => x.Id)
.Distinct()
.Count())
{
ModelState.AddModelError(string.Empty, "You can't select the same option more than once");
//etc.
}
【问题讨论】:
-
你可能不得不编写自己的自定义验证来迭代列表并检查每个值,我猜。您还可以使用一些 Javascript 来根据其他下拉列表中的内容来限制每个下拉列表中的内容,以降低传入数据包含错误的可能性。
-
@ADyson 非常感谢您的意见。您能否为自定义验证提供进一步的帮助?不幸的是,如果我使用 javascript 删除第二个下拉列表中的“on-call”选项,那么在示例场景中会出现一个问题,即用户删除第一行(每行末尾都有一个删除按钮。)第二个然后下拉菜单需要有待命选项。并且在添加到未选择待命的页面的任何其他下拉列表中。用户不太可能遇到这个问题,但无论如何它有点混乱。希望有更简单的出路!
-
您必须编写一些调用删除的 js 来确定哪些下拉列表不再包含正确的选项。一旦你弄清楚你的逻辑,应该是相对直截了当的。提示:将流程写在纸上,然后转换成代码。
-
@MrJF 这就是我刚刚开始做的事情;现在正在为“转换为代码位”而苦苦挣扎:)
-
我知道那种感觉!你可能最好尝试一个简单的实现来做一小部分,比如填充列表。然后尝试添加和删除项目。然后继续逐步让它做更多的事情!
标签: c# jquery asp.net-mvc unobtrusive-validation