Ajax json à MVC5 contrôleur de: objet de Passage contenant une collection

Les gens, j'ai tenté ce sur MVC4 et MVC5.

J'ai besoin de passer un objet avec un peu de propriétés et d'une collecte par le client pour le contrôleur.

J'ai défini le modèle en C#:

public enum RequestMode { ReadOnly = 0, Edit = 1}

public class DataRequest
{
    public int ProjectId { get; set; }
    public RequestMode Mode { get; set; }
    public List<PageRequest> PageRequests { get; set; }

    public DataRequest()
    {
        PageRequests = new List<PageRequest>();
    }
}

public class PageRequest
{
    public int Id { get; set; }
    public int PageCurrent { get; set; }
    public int RowCountPerPage { get; set; }
}

Le MVC Contrôleur est défini comme (je l'utilise juste pour définir un point d'arrêt pour vérifier les valeurs de demande):

[HttpPost]
public JsonResult Test(DataRequest request)
{
    return new JsonResult();
}

L'Index.cshtml client contient l'appel ajax:

<script type="text/javascript">
    var RequestMode = { ReadOnly: 0, Edit: 1 };

    var dataRequest = { ProjectId: 17, Mode: RequestMode.Edit, PageRequests: new Array() };
    var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 };
    dataRequest.PageRequests.push(pageRequest);

    $(document).ready(function () {
        $.ajax({
            data: dataRequest,
            type: 'POST',
            cache: false,
            url: '/Home/Test',
            success: function (data) {
            },
            fail: function (data) {

            }
        });

    });

</script>

J'ai démarrer le débogage, le chargement de la page et mon point d'arrêt dans le contrôleur de la méthode d'Essai est touché.

Dans le débogueur, l'objet de la requête s'affiche comme:
Mode: Modifier
PageRequests: Count = 1
ProjectId: 17

Quand je développez le PageRequests propriété collection, je vois:
{Mvc5WebTest.Les contrôleurs.PageRequest}
Id: 0
PageCurrent: 0
RowsPerPage: 0

J'attendrais la PageRequest objet à être rempli avec les valeurs que j'ai mis (p. 3165, 4, 30)

À l'aide de Fiddler, je vois que le DataRequest objet est de se faire virer en Json correctement, mais il semble que le MVC contrôleur ne peut pas tourner le dos à l'objet C#.

Comme une solution de contournement, je peux modifier l'appel ajax sur le client pour
var pcem = JSON.stringify(dataRequest);

$.ajax({
    dataType: 'json',
    type: 'GET',
    data: { jsonRequest: cdr },
    ...

Et puis dans le contrôleur

[HttpGet]
public ActionResult Test(string jsonRequest)
{
    var request = JsonConvert.DeserializeObject<DataRequest>(jsonRequest);
    return new JsonResult();
}

Cela fonctionne, mais je préfère ne pas transmettre les données sous forme de chaîne.

Quelqu'un peut jeter un peu de lumière à ce qui se passe et ce que je dois faire pour obtenir la collection peuplée?

Assurez-vous de toujours lire les descriptions qui apparaissent lors de la sélection des tags!

OriginalL'auteur Arjay H. | 2014-03-20