我正在使用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
}
向用户显示一个包含以下表单的视图:
<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; }
}
答案 0 :(得分:1)
我最终使用了一个单独的视图模型(如我的问题中的一个可能的解决方案中所述),可以完全验证。这是一种解决方法,我仍然想知道如何正确地做到这一点。