首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Html.BeginCollectionItem与IValidatableObject和MemberName失配

@Html.BeginCollectionItem与IValidatableObject和MemberName失配
EN

Stack Overflow用户
提问于 2013-09-30 21:07:48
回答 1查看 1.3K关注 0票数 0

在使用Sanderson的@Html.BeginCollectionItem助手时,我试图使用IValidatableObject接口验证服务器端的集合项。

我希望阻止用户选择两个相等的项。因此,例如,给定用户所说的习语列表,您可以回发以下值:

代码语言:javascript
复制
English
English
Spanish

Validate实现如下所示:

代码语言:javascript
复制
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" });
        }
    }
}

这方面的问题是,传递给MemberNameValidationResult (“成语”)与ModelState字典中的MemberName不同,因为史蒂文的助手使用Guid,如下所示:

代码语言:javascript
复制
[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获得这些信息,即使这是可能的。无论如何,这必须是动态的。

你知道有什么办法可以克服这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-01 20:27:21

在谷歌搜索了很多之后,我找到了做我想做的事情的正确方法:

ASP.NET MVC 3中的模型验证

验证(.))在ViewModel中的集合/列表属性中,必须添加

代码语言:javascript
复制
@Html.ValidationMessageFor(u => u.Idioms)

对于View中的属性,并在Validate方法中组合errorMessage。最后,将消息分配给正确的属性名称,在我的示例中是Idioms

代码语言:javascript
复制
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端执行以下操作:

代码语言:javascript
复制
@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(u => u.Idioms).ToHtmlString()))

产出将是:

代码语言:javascript
复制
French was selected 2 times
English was selected 3 times
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19103856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档