通用类型模型绑定和BindAttribute

时间:2009-05-12 17:32:48

标签: c# asp.net-mvc

我遇到了asp.net mvc中bind属性的问题。我有一个自定义ViewModel,如下所示:

public interface IUserView<TUser> where TUser : User
{
    TUser User { get; set; }
    string Email { get; set; }
    string ConfirmEmail { get; set; }
    string Password { get; set; }
    string ConfirmPassword { get; set; }
}
public class EditUserView<TUser> : IUserView<TUser> where TUser : User
{
    public virtual TUser User { get; set; }

    [ValidateRegExp(RegexConstants.Email, "Invalid Email.")]
    [ValidateNonEmpty("email is required.")]
    public virtual string Email { get; set; }

    [ValidateSameAs("Email", "confirmation email does not match.")]
    public virtual string ConfirmEmail { get; set; }


    public virtual string Password { get; set; }

    [ValidateSameAs("Password", "confirmation password does not match.")]
    public virtual string ConfirmPassword { get; set; }
}

以及提交此方法的方法如下:

public ActionResult SubmitProfile([Bind(Exclude="IsSystemAdmin")]EditUserView<Admin> iuserview)

如果你看一下上面的方法,你会注意到带有'Exclude =“IsSystemAdmin”'的bind属性。 admin模型有一个名为“IsSystemAdmin”的布尔属性,可以提升其权限级别。现在显然我不希望管理员能够通过回发此字段的真值来使自己成为系统管理员。

我在exclude属性中尝试了“IsSystemAdmin”和“User.IsSystemAdmin”,它们都没有阻止IsSystemAdmin变量更新。有没有办法让bind属性在这种情况下工作,或者这是Default模型绑定器中的错误?

1 个答案:

答案 0 :(得分:1)

您是否尝试过在TUser类本身上使用Bind属性

[Bind(Exclude = "IsSysAdmin")]
public class TUser 
{

}

我认为由于此属性的重要性,您永远不会希望由模型绑定器设置它,因此类上的绑定就可以了。您最有可能通过在操作上显式设置标志来将Admin增加到sysadmin。

我非常警惕直接从表单帖子绑定任何Model类。我的存储库层中的绑定和更新模型类的特定表单类只能通过另一个服务层。