2010-10-27 3 views
4

J'ai une action de contrôleur comme:ASP.NET MVC Int paramètre Array avec les valeurs par défaut de tableau vide à {0}

Public ActionResult MyAction(int[] stuff){} 

Je fais une demande JSON comme:

$.getJSON(url, { stuff: [] }) 

Quand il arrive à C# il ressemble à un tableau avec un élément, qui est nul (c'est-à-dire comme si je l'avais fait int[] stuff = {0};).

Est-ce nouveau avec MVC 2 ou .NET 4? Il semble avoir changé récemment, mais je n'ai pas trouvé un fusil fumant. Comment puis-je contourner cela? Ce comportement ne peut pas être attendu, n'est-ce pas?

+1

Vous remarquerez aussi que ce comportement n'a rien à voir avec AJAX/JSON. Vous obtiendrez le même résultat si vous appelez votre contrôleur et passez des "trucs" via la chaîne de requête (par exemple/MyAction? Stuff =) –

+0

@Hector: bon point, merci. – Xodarap

Répondre

2

Je pense que ce bogue dans MVC:

// create a vpr with raw value and attempted value of empty string 
ValueProviderResult r = new ValueProviderResult("", "", System.Globalization.CultureInfo.CurrentCulture); 
// this next line returns {0} 
r.ConvertTo(typeof(int[])); 

Si nous regardons ValueProviderResult.cs en fonction UnwrapPossibleArrayType, nous voyons:

// case 2: destination type is array but source is single element, so wrap element in array + convert 
object element = ConvertSimpleType(culture, value, destinationElementType); 
IList converted = Array.CreateInstance(destinationElementType, 1); 
converted[0] = element; 
return converted; 

Il oblige converted[0] être élément, et ConvertSimpleType jette "" à 0. Donc je termine cette question, sauf si quelqu'un a plus d'informations.

EDIT: Aussi, ce n'est pas dans la révision 17270, donc si vous faites une liste de choses qui changent de MVC 1 à MVC 2, c'est l'un d'entre eux.

0

Lorsque j'ai testé le code, j'ai reçu le tableau null dans l'action du contrôleur et non un tableau avec un élément.

Dans jquery 1.4 et versions ultérieures, les paramètres de sérialisation des paramètres lors d'une requête AJAX ont changé et ne sont plus compatibles avec le classeur par défaut. Vous pouvez définir le paramètre traditional lors de l'exécution de la demande:

$.getJSON(url, $.param({ stuff: [ 1, 2, 3 ] }, true)); 

ou

$.ajax({ 
    url: url, 
    type: 'GET', 
    dataType: 'JSON', 
    data: { stuff: [ 1, 2, 3 ] }, 
    traditional: true, 
    success: function(res) { } 
}); 
+0

J'utilise traditionnel, et je reçois toujours ceci. Voir le commentaire d'Hector; le problème se produit toujours quand vous venez de mettre dans l'url? var = – Xodarap

Questions connexes