Question

Je veux être en mesure d'envoyer JSON par opposition à la norme QueryStrings lors d'un poste à mes contrôleurs dans ASP.Net MVC. J'ai les choses Front-End fonctionne bien (bâtiment, puis soumettre mes objets JSON).

Le problème est du côté du contrôleur où les ModelBinders par défaut livrés avec le framework MVC ne prennent pas en charge cela.

Je l'ai vu une combinaison de façons de contourner cela, l'un d'entre eux est d'appliquer un filtre qui prend l'objet en tant que paramètre, utilise une bibliothèque JSON pour désérialiser, et ajoute que les paramètres d'action. Ce n'est pas idéal.

L'autre, mieux, est d'utiliser un modèle sur mesure Binder. Tous ceux que j'ai vu supposer que vous aurez un seul modèle et ce sera une classe plutôt qu'une variable. Si vous avez plusieurs de ceux qu'il tombe en panne.

Quelqu'un at-il rencontré ce? Une idée que j'avais été si je pouvais tout simplement passer outre comment traite MVC avec le FormCollection et l'interception il, en ajoutant les valeurs à la collection et moi-même dans l'espoir MVC peut faire le reste dans son mode normal. Est-ce que quelqu'un sait si cela est possible?

La question clé, je pense, est que mon problème est pas avec la liaison parce que mes modèles de vue ne sont pas différents de la façon dont ils où auparavant. Le problème est d'obtenir les valeurs de la JSON Post.

Si je ne me trompe pas MVC get les valeurs de la QueryString et il met dans la collection de forme qui est ensuite utilisé pour ModelBinding. Donc, ne devrait pas être la bonne méthode pour changer la façon dont le FormCollection se voit assigner?

Exemple d'une action:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}

Les travaux de liaison normale, JSON ne fonctionne pas et tout l'exemple du modèle Liants ne fonctionnera pas non plus. Ma meilleure solution est à ce jour pour convertir l'objet à un dictionnaire et une boucle si chaque param et le faire correspondre. Ne semble pas idéal.

Était-ce utile?

La solution

J'utilise un liant modèle personnalisé pour JSON comme ceci:

public class JsonModelBinder<T> : IModelBinder {
    private string key;

    public JsonModelBinder(string requestKey) {
        this.key = requestKey;
    }

    public object BindModel(ControllerContext controllerContext, ...) {
        var json = controllerContext.HttpContext.Request[key];
        return new JsonSerializer().Deserialize<T>(json);
    }
}

et le fil puis dans Global.asax.cs comme ceci:

ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));

Vous pouvez en savoir plus sur ce ici: l'héritage est Evil: The Epic Fail du DataAnnotationsModelBinder

EDIT

Le JsonModelBinder doit être utilisé sur le paramètre d'action du contrôleur typée comme seul produit. Le Int32 et classObject devraient revenir à la DefaultModelBinder. Éprouvez-vous un résultat différent?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top