asp.net-mvc - tutorial - gestion des utilisateurs asp.net mvc



ASP.NET MVC Comment passer l'objet JSON de la vue au contrôleur en tant que paramètre (4)

Une prise différente avec un simple plugin jQuery

Même si les réponses à cette question sont attendues depuis longtemps, mais je suis toujours en train de poster une bonne solution avec laquelle je suis venu il y a quelques temps et qui simplifie l' envoi d' actions de contrôleurs JSON vers Asp.net MVC complexes. paramètres de type.

Ce plugin supporte aussi bien les dates , donc elles sont converties en leur équivalent DateTime sans problème.

Vous pouvez trouver tous les détails dans mon article de blog où j'examine le problème et fournir le code nécessaire pour accomplir ceci.

Tout ce que vous avez à faire est d'utiliser ce plugin côté client. Une requête Ajax ressemblerait à ceci:

$.ajax({
    type: "POST",
    url: "SomeURL",
    data: $.toDictionary(yourComplexJSONobject),
    success: function() { ... },
    error: function() { ... }
});

Mais ce n'est qu'une partie du problème. Maintenant, nous sommes en mesure de renvoyer JSON complexe au serveur, mais comme il sera lié à un type complexe qui peut avoir des attributs de validation sur les propriétés, les choses peuvent échouer à ce point. J'ai aussi une solution pour cela . Ma solution tire parti de la fonctionnalité jQuery Ajax où les résultats peuvent être réussis ou erronés (comme indiqué dans le code supérieur). Ainsi, lorsque la validation échoue, error fonction d' error est appelée comme elle est supposée l'être.

J'ai un objet JSON complexe qui est envoyé à la vue sans aucun problème (comme indiqué ci-dessous) mais je ne peux pas calculer comment Serialize ces données à un objet .NET quand il est renvoyé au contrôleur via un appel AJAX. Les détails des différentes parties sont ci-dessous.

   var ObjectA = {
        "Name": 1,
        "Starting": new Date(1221644506800),

        "Timeline": [
            {
                "StartTime": new Date(1221644506800),
                "GoesFor": 200

            }
            ,
            {
                "StartTime": new Date(1221644506800),
                "GoesFor": 100

            }

        ]
    };

Je ne suis pas sûr comment cet objet peut être passé à une méthode de contrôleur, j'ai cette méthode ci-dessous où l'objet Timelines reflète l'objet JS ci-dessus en utilisant les propriétés.

public JsonResult Save(Timelines person)

Le jQuery que j'utilise est:

        var encoded = $.toJSON(SessionSchedule);

        $.ajax({
            url: "/Timeline/Save",
            type: "POST",
            dataType: 'json',
            data: encoded,
            contentType: "application/json; charset=utf-8",
            beforeSend: function() { $("#saveStatus").html("Saving").show(); },
            success: function(result) {
                alert(result.Result);
                $("#saveStatus").html(result.Result).show();
            }
        });

J'ai vu cette question qui est similaire, mais pas tout à fait la même chose que je n'utilise pas de formulaires pour manipuler les données. Comment passer un type complexe en utilisant json au contrôleur ASP.NET MVC

J'ai également vu des références à l'utilisation d'un 'JsonFilter' pour désérialiser manuellement le JSON, mais je me demandais s'il y avait un moyen de le faire nativly bien ASP.NET MVC? Ou quelles sont les meilleures pratiques pour transmettre des données de cette manière?


Answer #1

Cette réponse fait suite à la réponse de DaRKoN qui utilisait le filtre d'objet:

[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
    public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }

J'avais un problème pour trouver comment envoyer plusieurs paramètres à une méthode d'action et avoir l'un d'entre eux soit l'objet json et l'autre soit une chaîne simple. Je suis nouveau à MVC et j'avais juste oublié que j'avais déjà résolu ce problème avec des vues non-ajaxed.

Ce que je ferais si j'avais besoin, disons, de deux objets différents sur une vue. Je voudrais créer une classe ViewModel. Donc dis que j'avais besoin de l'objet personne et de l'objet adresse, je ferais ce qui suit:

public class SomeViewModel()
{
     public Person Person { get; set; }
     public Address Address { get; set; }
}

Ensuite, je lierais la vue à SomeViewModel. Vous pouvez faire la même chose avec JSON.

[ObjectFilter(Param = "jsonViewModel", RootType = typeof(JsonViewModel))] // Don't forget to add the object filter class in DaRKoN_'s answer.
public JsonResult doJsonStuff(JsonViewModel jsonViewModel)
{
     Person p = jsonViewModel.Person;
     Address a = jsonViewModel.Address;
     // Do stuff
     jsonViewModel.Person = p;
     jsonViewModel.Address = a;
     return Json(jsonViewModel);
}

Ensuite, dans la vue, vous pouvez utiliser un simple appel avec JQuery comme ceci:

var json = { 
    Person: { Name: "John Doe", Sex: "Male", Age: 23 }, 
    Address: { Street: "123 fk st.", City: "Redmond", State: "Washington" }
};

$.ajax({
     url: 'home/doJsonStuff',
     type: 'POST',
     contentType: 'application/json',
     dataType: 'json',
     data: JSON.stringify(json), //You'll need to reference json2.js
     success: function (response)
     {
          var person = response.Person;
          var address = response.Address;
     }
});

Answer #2

Vous dites "Je n'utilise pas de formulaires pour manipuler les données". Mais vous faites un POST. Par conséquent, vous utilisez en fait un formulaire, même s'il est vide.

Le dataType dataType de $ .ax dit à jQuery quel type le serveur retournera , pas ce que vous passez. POST peut seulement passer un formulaire. jQuery dataType et les transmettra en tant que chaîne de requête. De la docs:

Données à envoyer au serveur. Il est converti en une chaîne de requête, si ce n'est déjà une chaîne. Il est ajouté à l'URL pour les demandes GET. Voir l'option processData pour empêcher ce traitement automatique. L'objet doit être une paire clé / valeur. Si value est un Array, jQuery sérialise plusieurs valeurs avec la même clé ie {foo: ["bar1", "bar2"]} devient '& foo = bar1 & foo = bar2'.

Donc:

  1. Vous ne transmettez pas JSON au serveur. Vous passez JSON à jQuery.
  2. La liaison de modèle se passe de la même manière que dans tous les autres cas.

Answer #3

en réponse au commentaire de Dan ci-dessus:

J'utilise cette méthode pour implémenter la même chose, mais pour une raison quelconque j'obtiens une exception sur la méthode ReadObject: "Expecting element 'root' from namespace ''. Rencontré 'None' avec le nom '', namespace ''. " Des idées pourquoi? - Dan Appleyard 6 avril 10 à 17:57

J'ai eu le même problème (MVC 3 build 3.0.11209.0), et le post ci-dessous l'a résolu pour moi. Fondamentalement, le sérialiseur json essaie de lire un flux qui n'est pas au début, repositionnant ainsi le flux à 0 'fixé' ...

http://nali.org/asp-net-mvc-expecting-element-root-from-namespace-encountered-none-with-name-namespace/





json