534 Stimmen

Übergabe eines Arrays von Ganzzahlen an ASP.NET Web API?

Ich habe einen ASP.NET Web API (Version 4) REST-Dienst, wo ich ein Array von Ganzzahlen übergeben müssen.

Hier ist meine Aktionsmethode:

public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}

Und dies ist die URL, die ich ausprobiert habe:

/Categories?categoryids=1,2,3,4

3voto

Damn Vegetables Punkte 10036

Alle anderen Lösungen erfordern zu viel Arbeit. Ich habe versucht, die IEnumerable<long> o long[] in einem HttpGet Methodenparameter, aber ich sehe keinen Grund, die ganze Arbeit zu machen, nur um die Signatur des Parameters der Handler-Methode long[] . Am Ende habe ich es einfach zu einer Zeichenkette gemacht und sie dann im Handler getrennt. Ich brauchte nur eine Zeile.

public async Task<IActionResult> SomeHandler(string idsString)
{
    var ids = idsString.Split(',').Select(x => long.Parse(x));

Jetzt können Sie die Zahlen einfach wie folgt übergeben

.../SomeHandler?idsString=123,456,789,012

0voto

Alan Cardoso Punkte 83

Meine Lösung war, ein Attribut zu erstellen, um Zeichenfolgen zu validieren, es tut ein paar zusätzliche gemeinsame Funktionen, einschließlich Regex-Validierung, die Sie verwenden können, um nur für Zahlen zu überprüfen und dann später konvertieren ich in Ganzzahlen wie benötigt...

So verwenden Sie es:

public class MustBeListAndContainAttribute : ValidationAttribute
{
    private Regex regex = null;
    public bool RemoveDuplicates { get; }
    public string Separator { get; }
    public int MinimumItems { get; }
    public int MaximumItems { get; }

    public MustBeListAndContainAttribute(string regexEachItem,
        int minimumItems = 1,
        int maximumItems = 0,
        string separator = ",",
        bool removeDuplicates = false) : base()
    {
        this.MinimumItems = minimumItems;
        this.MaximumItems = maximumItems;
        this.Separator = separator;
        this.RemoveDuplicates = removeDuplicates;

        if (!string.IsNullOrEmpty(regexEachItem))
            regex = new Regex(regexEachItem, RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var listOfdValues = (value as List<string>)?[0];

        if (string.IsNullOrWhiteSpace(listOfdValues))
        {
            if (MinimumItems > 0)
                return new ValidationResult(this.ErrorMessage);
            else
                return null;
        };

        var list = new List<string>();

        list.AddRange(listOfdValues.Split(new[] { Separator }, System.StringSplitOptions.RemoveEmptyEntries));

        if (RemoveDuplicates) list = list.Distinct().ToList();

        var prop = validationContext.ObjectType.GetProperty(validationContext.MemberName);
        prop.SetValue(validationContext.ObjectInstance, list);
        value = list;

        if (regex != null)
            if (list.Any(c => string.IsNullOrWhiteSpace(c) || !regex.IsMatch(c)))
                return new ValidationResult(this.ErrorMessage);

        return null;
    }
}

0voto

Guilhermlimma Punkte 643

Ich habe gerade die Abfrage (Refit lib) in der Eigenschaft für die Anfrage.

[Query(CollectionFormat.Multi)]

public class ExampleRequest
{

        [FromQuery(Name = "name")]
        public string Name { get; set; }               

        [AliasAs("category")]
        [Query(CollectionFormat.Multi)]
        public List<string> Categories { get; set; }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X