如何向MVC3中的同一对象的实例显示不同的Required消息?

时间:2011-05-02 16:27:40

标签: asp.net-mvc-3 validation

我有一个Razor MVC3项目,它在表单中有两个用户记录,一个用于密钥联系,另一个用于备份联系。例如;

public class User
{
    [Required(ErrorMessage = "First name is required")]
    public string FirstName { get; set; }
}

验证一切正常,除了用户未能填写字段的小问题,它说“需要名字”,但我想指出用户缺少哪个名字字段。例如“需要备份联系人姓名”或“需要密钥联系人名字”。

理想情况下,我希望将[必需]注释保留在类中,因为它在别处使用。

这似乎是一些可能错过并且不容易实现的小案例,但请证明我错了。

赖安

3 个答案:

答案 0 :(得分:19)

您可以通过单独的视图模型来实现此目的,而不是使用包含所有错误消息的单个用户模型。在新的视图模型中,您可以拥有BackupContactFirstName属性,KeyContactFirstName属性等,每个属性都有其单独的错误消息。 (或者,此视图模型可以包含单独的用户模型作为属性,但我发现Microsoft的客户端验证不适用于复杂模型并且更喜欢平面属性)。

您的视图模型如下所示:

public class MySpecialScreenViewModel
{
    [Required(ErrorMessage = "Backup contact first name is required")]
    public string BackupContactFirstName { get; set; }


    [Required(ErrorMessage = "Key contact first name is required")]
    public string KeyContactFirstName { get; set; }
}

然后将您的视图模型传递给视图:

@model MySpecialScreenViewModel
...

您的帖子控制器操作将从视图模型中收集属性(或将它们映射到单独的用户模型)并将它们传递给适当的数据处理方法。

答案 1 :(得分:1)

我偶然发现了一个替代方案,只需修改ModelState集合即可。它将具有由index命名的集合中的元素,如“User_0__EmailAddress”,您可以调整/修改/替换与该键关联的Errors集合。

答案 2 :(得分:1)

[Required(ErrorMessage = "{0} is required")]
  

{0} = DisplayName自动放在其上

样品

[DisplayName("Amount per square meter")]
[Required(ErrorMessage = "{0} is required")]
public int PriceMeter { get; set; }

输出

  

每平方米的金额是必需的