在使用Sanderson的@Html.BeginCollectionItem助手时,我试图使用IValidatableObject接口验证服务器端的集合项。
我希望阻止用户选择两个相等的项。因此,例如,给定用户所说的习语列表,您可以回发以下值:
English
English
SpanishValidate实现如下所示:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach(var idiom in Idioms)
{
if(Idioms.Any(i => i != idiom && i.Idiom == idiom.Idiom))
{
yield return new ValidationResult("Idiom already selected", new string[] { "Idiom" });
}
}
}这方面的问题是,传递给MemberName的ValidationResult (“成语”)与ModelState字典中的MemberName不同,因为史蒂文的助手使用Guid,如下所示:
[42] = {[Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiom, System.Web.Mvc.ModelState]}正如你所看到的,Idiom != [Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiom。
在最好的情况下,我必须有一种方法来传递,例如,[Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiom作为MemberName,但我不知道如何从validationContext获得这些信息,即使这是可能的。无论如何,这必须是动态的。
你知道有什么办法可以克服这个问题吗?
发布于 2013-10-01 20:27:21
在谷歌搜索了很多之后,我找到了做我想做的事情的正确方法:
ASP.NET MVC 3中的模型验证
验证(.))在ViewModel中的集合/列表属性中,必须添加
@Html.ValidationMessageFor(u => u.Idioms)对于View中的属性,并在Validate方法中组合errorMessage。最后,将消息分配给正确的属性名称,在我的示例中是Idioms。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var grouping = Idioms.GroupBy(ui => ui.Idiom);
var duplicates = grouping.Where(group => group.Count() > 1);
if(duplicates.Any())
{
string message = string.Empty;
foreach(var duplicate in duplicates)
{
message += string.Format("{0} was selected {1} times", duplicate.Key, duplicate.Count());
}
yield return new ValidationResult(message, new[] { "Idioms" });
}
}奖金
如果要在separate lines中显示每个重复组(添加换行符<br>),请执行以下操作:
将{0} was selected {1} times替换为{0} was selected {1} times<br>
然后在View端执行以下操作:
@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(u => u.Idioms).ToHtmlString()))产出将是:
French was selected 2 times
English was selected 3 timeshttps://stackoverflow.com/questions/19103856
复制相似问题