0

名前、電子メール、電話などのいくつかのフィールドを持つこのようなモデルがあります。これらはすべて [Required] 属性で設定されます。

私がやりたいことは、RequiredAttribute をオーバーライドし、Web サイトの現在の訪問者が管理者でない場合にのみプロパティを要求することです。したがって、基本的に、管理者は好きなように入力するか、通常のユーザーができないフィールドを空のままにすることができます。

誰かが私を正しい方向に向けたり、これを達成するための最良の方法についてアドバイスしたりできますか?

訪問者が管理者かどうかを調べるには、次を使用します。

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 の使用を検討することをお勧めします。FluentValidationを使用すると、カスタム属性を作成しなくても組み込みのデータ注釈で許可されるよりもはるかに複雑なルールを指定できます。

次に、次のような構文を使用してこれを解決できます。

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