【问题标题】:Model validation with enumerable properties in Asp.net MVC2 RTM在 Asp.net MVC2 RTM 中使用可枚举属性进行模型验证
【发布时间】:2010-03-18 23:09:13
【问题描述】:

我正在使用DataAnnotations 属性来验证我的模型对象。我的模型类看起来与此类似:

public class MyModel
{
    [Required]
    public string Title { get; set; }

    [Required(ErrorMessage = "At least one editor is required.")]
    public List<User> Editors { get; set; }
}

public class User
{
    public int Id { get; set; }

    [Required]
    public string FullName { get; set; }

    [Required]
    [DataType(DataType.Email)]
    public string Email { get; set; }
}

我的控制器动作如下:

public ActionResult NewItem(MyModel data)
{
    if (!this.Model.IsValid)
    {
        // invalid processing
    }
    // valid processing
}

向用户展示的视图具有以下形式:

  • 一个带有虚拟名称的文本框,用户可以在其中输入用户名。对于他们输入的每个用户,都有一个与 ajax 相结合的客户端脚本,它为每个输入的用户创建一个&lt;input type="hidden" name="Editors[0].Id" value="userId" /&gt;(因此枚举索引并不总是像这里写的那样为 0),因此默认模型绑定器能够使用和绑定表单而无需任何问题。
  • 用户输入标题的文本框

由于我使用的是 Asp.net MVC 2 RTM,它进行模型验证而不是输入验证,所以我不知道如何避免验证错误。由于用户提供了User.Id,整个User 对象实例正在被验证。这不会打扰我,只要我知道如何排除其他属性的验证。

问题是我必须在我的控制器操作中使用BindAttribute。我必须提供属性的白名单或黑名单。提供白名单始终是一种更好的做法。这也是更多的未来证明。

问题

我的表单工作正常,但我收到关于用户的FullNameEmail 属性的验证错误,因为它们没有提供。我也不应该将它们提供给客户端(当用户输入用户数据时通过 ajax),因为电子邮件是个人联系数据,不会在用户之间共享。

如果MyModel 上只有一个用户引用,我会写

[Bind(Include = "Title, Editor.Id")]

但我列举了它们。 如何提供Bind 白名单以与我的模型一起使用?

一种可能的解决方案

我可以为User 创建一个单独的视图模型,只是为了输入 MyModel 对象。我会放置实际的验证属性并省略我不需要的属性。

public class MyModelUser
{
    [Required]
    public int Id { get; set; }
}

【问题讨论】:

    标签: asp.net-mvc-2 data-annotations model-validation


    【解决方案1】:

    我最终使用了一个单独的视图模型(如我的问题中的一种可能的解决方案所述),它可以得到充分验证。这是一种解决方法,我仍然想知道如何正确地做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2011-03-04
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多