我在用着 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 相结合,创建一个 <input type="hidden" name="Editors[0].Id" value="userId" /> 对于输入的每个用户(因此枚举索引并不总是此处所写的 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; }
}
有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top