我正在使用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
在我的控制器动作上使用。我必须提供属性的白名单或黑名单。提供白名单始终是一种更好的做法。这也是更多的未来证明。
问题
我的表单工作正常,但我收到有关用户FullName
和Email
属性的验证错误,因为它们没有提供。我也不应该将它们提供给客户端(当用户输入用户数据时通过 ajax),因为电子邮件是个人联系数据,不会在用户之间共享。
如果只有一个用户参考,MyModel
我会写
[Bind(Include = "Title, Editor.Id")]
但我列举了它们。如何提供Bind
与我的模型一起使用的白名单?
一种可能的解决方案
User
为了输入 MyModel 对象,我可以创建一个单独的视图模型。我会放置实际的验证属性并省略我不需要的属性。
public class MyModelUser
{
[Required]
public int Id { get; set; }
}