9
votes

Méthode avec paramètre de dictionnaire dans ASP.NET Web API

Je dois faire une demande d'obtention d'une méthode contenant le dictionnaire comme paramètre. Je parcourais mais je n'ai trouvé aucun type d'informations sur la manière dont je pourrais envoyer le dictionnaire afin que ma demande soit heurtée à ma méthode. La signature de la méthode est comme ci-dessous xxx

meilleures salutations,

Kemal


1 commentaires

@kkcocabiyik avez-vous pu transmettre les éléments dans votre demande d'obtention en tant que paramètres de requête URL? Si oui, pouvez-vous poster un échantillon de la syntaxe à utiliser? Merci!


4 Réponses :


12
votes

5 commentaires

Aspic. Net Web API fait partie de ASP.NET MVC


@Kirillbestemyanov à partir d'une perspective marketing Oui. À partir d'une perspective de mise en œuvre, il y a un peu de chevauchement, mais il existe également beaucoup de code API Web distinct de MVC. Dans le cas du classeur de modèle cependant, je crois que le code est partagé.


@Kirillbestemyanov Ce n'est pas vrai. Comme Darrel dit que cela pourrait être commercialisé comme quelque chose qui en fait partie, mais c'est loin de la vérité. L'API Web est avant tout, tout d'abord, stand seul. Et le modèle de liaison elle-même est beaucoup différent, voir: blogs.msdn.com/b/jmstall/archive/2012/04/16/...


Cette réponse n'est pas utile et très trompeuse car la question concerne l'API Web, qui fonctionne différemment au MVC 5.


Et peut-être que vous ajoutez une bonne réponse au lieu de cela? Cette réponse a été écrite il y a 1 et demi année basée sur MVC 4 et Web API 1.0.



-5
votes

Vous pouvez utiliser le dictionnaire comme paramètre de cette manière:

protected object DictionaryFunction()
{
    Dictionary<int,YourObjectName> YourDictionaryObjectName=new Dictionary<int,YourObjectName>();
    ...
    ...

    return YourDictionaryObjectName;
}

protected MyFunction()
{
    Dictionary<int,YourObjectName> MyDictionary=(Dictionary<int,YourObjectName>)DictionaryFunction();
}


0 commentaires

2
votes

J'ai écrit un modèle de modèle qui fait exactement ce que vous vouliez:

public class DictionaryModelBinder : DefaultModelBinder
{
    private const string _dateTimeFormat = "dd/MM/yyyy HH:mm:ss";

    private enum StateMachine
    {
        NewSection,
        Key,
        Delimiter,
        Value,
        ValueArray
    }

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var stream = controllerContext.HttpContext.Request.InputStream;
        string text;

        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
            text = reader.ReadToEnd();
        }

        int index = 0;
        return Build(text, ref index);
    }

    private static Dictionary<string, object> Build(string text, ref int index)
    {
        var state = StateMachine.NewSection;
        var dictionary = new Dictionary<string, object>();
        var key = string.Empty;
        object value = string.Empty;

        for (; index < text.Length; ++index)
        {
            if (state == StateMachine.NewSection && text[index] == '{')
            {
                dictionary = new Dictionary<string, object>();
                state = StateMachine.NewSection;
            }
            else if (state == StateMachine.NewSection && text[index] == '"')
            {
                key = string.Empty;
                state = StateMachine.Key;
            }
            else if (state == StateMachine.Key && text[index] != '"')
            {
                key += text[index];
            }
            else if (state == StateMachine.Key && text[index] == '"')
            {
                state = StateMachine.Delimiter;
            }
            else if (state == StateMachine.Delimiter && text[index] == ':')
            {
                state = StateMachine.Value;
                value = string.Empty;
            }
            else if (state == StateMachine.Value && text[index] == '[')
            {
                state = StateMachine.ValueArray;
                value = value.ToString() + text[index];
            }
            else if (state == StateMachine.ValueArray && text[index] == ']')
            {
                state = StateMachine.Value;
                value = value.ToString() + text[index];
            }
            else if (state == StateMachine.Value && text[index] == '{')
            {
                value = Build(text, ref index);
            }
            else if (state == StateMachine.Value && text[index] == ',')
            {
                dictionary.Add(key, ConvertValue(value));
                state = StateMachine.NewSection;
            }
            else if (state == StateMachine.Value && text[index] == '}')
            {
                dictionary.Add(key, ConvertValue(value));
                return dictionary;
            }
            else if (state == StateMachine.Value || state == StateMachine.ValueArray)
            {
                value = value.ToString() + text[index];
            }
        }

        return dictionary;
    }

    private static object ConvertValue(object value)
    {
        string valueStr;
        if (value is Dictionary<string, object> || value == null || (valueStr = value.ToString()).Length == 0)
        {
            return value;
        }

        bool boolValue;
        if (bool.TryParse(valueStr, out boolValue))
        {
            return boolValue;
        }

        int intValue;
        if (int.TryParse(valueStr, out intValue))
        {
            return intValue;
        }

        double doubleValue;
        if (double.TryParse(valueStr, out doubleValue))
        {
            return doubleValue;
        }

        valueStr = valueStr.Trim('"');

        DateTime datetimeValue;
        if (DateTime.TryParseExact(valueStr, _dateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out datetimeValue))
        {
            return datetimeValue;
        }

        if (valueStr.First() == '[' && valueStr.Last() == ']')
        {
            valueStr = valueStr.Trim('[', ']');
            if (valueStr.Length > 0)
            {
                if (valueStr[0] == '"')
                {
                    return valueStr
                        .Split(new[] { '"' }, StringSplitOptions.RemoveEmptyEntries)
                        .Where(x => x != ",")
                        .ToArray();
                }
                else
                {
                    return valueStr
                        .Split(',')
                        .Select(x => ConvertValue(x.Trim()))
                        .ToArray();
                }
            }
        }

        return valueStr;
    }
}


0 commentaires

0
votes

Si vous avez des problèmes de réception de dictionnaire dans votre contrôleur WebAPI, une solution relativement indolore consiste à commuter le paramètre à la liste <"ObjectRepresentingDict"> Insead. Il va mapper automatiquement.


0 commentaires