0

我有一个这样的模型,其中包含几个字段,例如姓名、电子邮件和电话。所有这些都是用 [Required] 属性设置的。

我想做的是覆盖RequiredAttribute,并且仅在网站的当前访问者不是管理员时才需要该属性。所以基本上管理员可以输入他们喜欢的内容,或者在普通用户无法输入的地方留空。

谁能指出我正确的方向或建议实现这一目标的最佳方法?

要确定访问者是否是管理员,我使用:

var permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString());

如果这是 0 或 1,则访问者不是管理员,因此该字段应为必填项。

4

2 回答 2

3

您可以编写自定义条件验证属性:

public class RequiredIfPermissionIdsAttribute : RequiredAttribute
{
    public int[] PermissionIds { get; private set; }

    public RequiredIfPermissionIdsAttribute(params int[] permissionIds)
    {
        PermissionIds = permissionIds ?? new int[0];
    }

    public override bool IsValid(object value)
    {
        int permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString());

        if (PermissionIds.Contains(permissionId))
        {
            return base.IsValid(value);
        }

        // the current permission id is not in the list of permission ids
        // that require validation => we consider the model valid
        return true;
    }
}

然后你可以用这个属性装饰你的财产:

[RequiredIfPermissionIds(0, 1)]
public string SomeProperty { get; set; }

或者,您可以使用白名单方法,而不是使用黑名单方法:

public class NotRequiredIfPermissionIdsAttribute : RequiredAttribute
{
    public NotRequiredIfPermissionIdsAttribute(params int[] permissionIds)
    {
        PermissionIds = permissionIds ?? new int[0];
    }

    public int[] PermissionIds { get; private set; }

    public override bool IsValid(object value)
    {
        int permissionId = Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId().ToString());

        if (!PermissionIds.Contains(permissionId))
        {
            return base.IsValid(value);
        }

        return true;
    }
}

进而:

[NotRequiredIfPermissionIds(2)]
public string SomeProperty { get; set; }
于 2012-10-15T16:40:45.620 回答
0

我建议考虑使用FluentValidation,它允许您指定更复杂的规则,然后内置数据注释允许,而无需构建自定义属性。

然后,您可以使用与此类似的语法来解决此问题:

RuleFor(obj => obj.Email).NotEmpty().Unless(obj => Helpers.ConvertToInt(Services.UserService.GetCurrentPermissionId()) > 1)
于 2012-10-15T17:28:21.450 回答