【问题标题】:Validating ASP.NET MVC2 FormCollection against Model针对模型验证 ASP.NET MVC2 FormCollection
【发布时间】:2011-08-02 17:13:12
【问题描述】:

假设我有一个带有如下验证的用户类设置:

[MetadataType(typeof(ssUserMetaData))]
public partial class ssUser
{

}

class ssUserMetaData
{
    [Required(ErrorMessage = "Name is a required field.")]
    [StringLength(100, ErrorMessage = "Name must be 100 characters or less.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Username is a required field.")]
    [StringLength(50, ErrorMessage = "Username must be 50 characters or less.")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Email address is a required field.")]
    [Email(ErrorMessage = "Email address must be a valid format.")]
    [StringLength(100, ErrorMessage = "Email address must be 100 characters or less.")]
    [DisplayName("Email address")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password is a required field.")]
    [StringLength(1000, MinimumLength = 6, ErrorMessage = "Passwords must be at least 6 characters long.")]
    [DisplayName("Password")]
    public string PasswordHash { get; set; }
}

现在,我有一个更新方法,它只允许用户更新几个字段,例如姓名和电子邮件。我不想重新提交此表单的所有数据以通过模型绑定,但我想使用此处配置的验证规则来检查表单集合中的特定值。

类似这个虚构的代码...

bool result = ModelState.ValidateField("Email", formCollection["Email"]);

有没有办法做这样的事情,这样我就可以避免重复我的验证规则?谢谢!

【问题讨论】:

  • 那么您是说要在 2 个表单上共享模型属性/属性?
  • 如果可能,我只需要将更新表单作为创建表单的有限子集。例如,您不能更改用户名,但可以更改电子邮件地址。

标签: c# asp.net-mvc-2 validation model-binding


【解决方案1】:

让小型表单使用 NameAndEmail 类,大型表单使用 SsUserMetaData 怎么样?

class NameAndEmail
{
    [Required(ErrorMessage = "Name is a required field.")]
    [StringLength(100, ErrorMessage = "Name must be 100 characters or less.")]
    public string Name { get; set; }


    [Required(ErrorMessage = "Email address is a required field.")]
    [Email(ErrorMessage = "Email address must be a valid format.")]
    [StringLength(100, ErrorMessage = "Email address must be 100 characters or less.")]
    [DisplayName("Email address")]
    public string Email { get; set; }
}
class SsUserMetaData : NameAndEmail
{
    [Required(ErrorMessage = "Username is a required field.")]
    [StringLength(50, ErrorMessage = "Username must be 50 characters or less.")]
    public string Username { get; set; }


    [Required(ErrorMessage = "Password is a required field.")]
    [StringLength(1000, MinimumLength = 6, ErrorMessage = "Passwords must be at least 6 characters long.")]
    [DisplayName("Password")]
    public string PasswordHash { get; set; }
}

【讨论】:

  • 在这种情况下我会使用public ActionResult Update(NameAndEmail user)吗?
  • 您的视图(或部分视图)也可以输入。
  • 酷,我认为这是可行的。我将我的模型保留为ssUser,并确保首先运行TryUpdateModel,以便它具有正确的值。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多