Объявите другое имя для атрибутов строки запроса - PullRequest
0 голосов
/ 24 апреля 2019

Есть ли способ / встроенное решение для сопоставления свойства строки запроса со свойством .NET?

Для экшена и модели:

public ActionResult Index(AuthInitialRequest request)
{
    return View(request);
}

public class AuthInitialRequest
{
     [Required]
     public string FooBar { get; set; }
     ...
}

Чего я хочу добиться, так это функциональности, аналогичной атрибуту JsonProperty. Который сопоставит свойство модели с атрибутом запроса на основе атрибута.

public class AuthInitialRequest
{
     [Required]
     [QueryStringProperty("foo-bar")
     public string FooBar { get; set; }
     ...
}

1 Ответ

1 голос
/ 19 июля 2019

Спасибо, mmushtaq, за то, что держите меня в курсе.BindAliasAttribute позволяет установить несколько псевдонимов для нашей модели

public class AliasModelBinder : DefaultModelBinder
{
    protected override PropertyDescriptorCollection
      GetModelProperties(ControllerContext controllerContext,
                        ModelBindingContext bindingContext)
    {
        var toReturn = base.GetModelProperties(controllerContext, bindingContext);

        List<PropertyDescriptor> additional = new List<PropertyDescriptor>();

        //now look for any aliasable properties in here
        foreach (var p in
          this.GetTypeDescriptor(controllerContext, bindingContext)
          .GetProperties().Cast<PropertyDescriptor>())
        {
            foreach (var attr in p.Attributes.OfType<BindAliasAttribute>())
            {
                additional.Add(new AliasedPropertyDescriptor(attr.Alias, p));

                if (bindingContext.PropertyMetadata.ContainsKey(p.Name))
                    bindingContext.PropertyMetadata.Add(attr.Alias,
                          bindingContext.PropertyMetadata[p.Name]);
            }
        }

        return new PropertyDescriptorCollection
          (toReturn.Cast<PropertyDescriptor>().Concat(additional).ToArray());
    }
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class BindAliasAttribute : Attribute
{
    public BindAliasAttribute(string alias)
    {
        Alias = alias;
    }

    public string Alias { get; private set; }

    public override object TypeId
    {
        get { return Alias; }
    }
}
internal sealed class AliasedPropertyDescriptor : PropertyDescriptor
{
    public PropertyDescriptor Inner { get; private set; }
    public AliasedPropertyDescriptor(string alias, PropertyDescriptor inner)
        : base(alias, null)
    {
        Inner = inner;
    }
    public override bool CanResetValue(object component)
    {
        return Inner.CanResetValue(component);
    }
    public override Type ComponentType
    {
        get { return Inner.ComponentType; }
    }
    public override object GetValue(object component)
    {
        return Inner.GetValue(component);
    }
    public override bool IsReadOnly
    {
        get { return Inner.IsReadOnly; }
    }
    public override Type PropertyType
    {
        get { return Inner.PropertyType; }
    }
    public override void ResetValue(object component)
    {
        Inner.ResetValue(component);
    }
    public override void SetValue(object component, object value)
    {
        Inner.SetValue(component, value);
    }
    public override bool ShouldSerializeValue(object component)
    {
        return Inner.ShouldSerializeValue(component);
    }
}

И атрибут, определенный так, можно использовать так:

[Required]
[BindAlias("original-url")]
public string Original_Url { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...