как использовать Guid в качестве значения конструктора атрибута или объекта в пользовательском атрибуте ValidationAttribute - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно передать значение Guid в пользовательский атрибут ValidationAttribute, но я получаю

Параметр конструктора атрибута 'siteUId' имеет тип Guid, который не является допустимым параметром атрибута type

Если я изменю Guid на object , я получу

Аргументом атрибута должно быть постоянное выражение, выражение typeof или выражение массива тип параметра атрибута

Валидатор :

public sealed class ViewNameAttribute : ValidationAttribute
{
    private readonly Guid _siteUId;

    /// <summary>
    /// Checks if a view with the same name exists
    /// </summary>
    /// <param name="siteUId">UId of site which to add view</param>
    public ViewNameAttribute(Guid siteUId)
    {
        _siteUId = siteUId;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        ISitesRepo repo = validationContext.GetRequiredService<ISitesRepo>();
        ISite site = repo.GetSite(this.SiteUId).Result;
        IStringLocalizer<ValidationResources> localizer = validationContext.GetRequiredService<IStringLocalizer<ValidationResources>>();
        string name = value.ToString();
        var tmp = site.Views.SingleOrDefault(vw => vw.Active && vw.Name.ToUpper() == name.ToUpper());

        if (!tmp.IsNull())
        {
            return new ValidationResult(localizer["SitesViewNameExists"].Value);
        }

        return ValidationResult.Success;
    }

    private Guid SiteUId => _siteUId;
}

Модель :

public interface ICreateViewModel
{
    string GroupName { get; set; }
    string Name { get; set; }
}

public class CreateViewModel : ICreateViewModel
{
    [FromRoute(Name = "site")]
    public static Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessageResourceType = typeof(IStringLocalizer<ValidationResources>), ErrorMessageResourceName = "SitesNewViewNameMissing")]
    [MinLength(6, ErrorMessageResourceType = typeof(IStringLocalizer<ValidationResources>), ErrorMessageResourceName = "SitesNewViewNameToShort")]
    [ViewName(SiteUId)]
    [FromForm(Name = "name")]
    public string Name { get; set; }
}

1 Ответ

1 голос
/ 21 апреля 2020

У меня тоже была эта проблема в прошлом. Единственный способ заставить его работать - передать значение в виде строки. Просто потому, что параметры должны быть постоянными. И guid не может быть константой, потому что это объект, содержащий ссылку.

Ранее об этом спрашивали в stackoverflow, что, к сожалению, подтверждает мое подозрение, что это невозможно.

Как мне взять GUID в качестве параметра атрибута?

public class ViewModel
{
    [Required]
    public string PropertyOne { get; set; }

    [Required]
    [ViewName("dec070c6-c25f-4e9d-a003-17ce72b74a94")]
    public string PropertyTwo { get; set; }
}

public sealed class ViewNameAttribute : ValidationAttribute
{
    private readonly Guid _siteUId;

    public ViewNameAttribute(string siteUId)
    {
        _siteUId = Guid.Parse(siteUId);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return ValidationResult.Success;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...