À l'aide de [FromUri] l'attribut bind objet complexe avec un tableau imbriqué
Je veux envoyer un objet complexe avec un tableau imbriqué dans l'uri à un MVC méthode d'action dans une requête GET.
Considérons le code suivant:
public ActionResult AutoCompleteHandler([FromUri]PartsQuery partsQuery){ ... }
public class PartsQuery
{
public Part[] Parts {get; set; }
public string LastKey { get; set; }
public string Term { get; set; }
}
$.ajax({
url: "Controller/AutoCompleteHandler",
data: $.param({
Parts: [{ hasLabel: "label", hasType: "type", hasIndex : 1 }],
LastKey : "Last Key",
Term : "Term"
}),
dataType: "json",
success: function(jsonData) { ... }
});
Cela fonctionne bien et se lie correctement en utilisant le modèle de classeur par défaut en MVC, Web Api.
Cependant, ce commutateur à la plaine de MVC n'est pas WebApi et le modèle de classeur par défaut tombe en panne et ne peut pas lier les propriétés sur les objets dans le tableau imbriqué:
Liste De Surveillance
partsQuery != null //Good
--LastKey == "Last Key" //Good
--Term == "Term" //Good
--Parts[] != null //Good
----hasLabel == null //Failed to bind
----hasType == null //Failed to bind
----hasIndex == 0 //Failed to bind
Je voudrais savoir pourquoi cela se décompose en plaine MVC et comment faire FromUriAttribute
lier cet objet correctement dans la plaine MVC
Qu'advient-il si vous changez
Essayez-les maintenant. Le cadre est simple POCO avec le public { get; set; } accessoires
Ne
ICollection n'a pas de résoudre le problème de liaison. Il ne disposait pas d'avoir un constructeur sans paramètre, mais j'ai juste essayé avec un et toujours pas aller (essayé avec ICollection).
Est-ce appel Ajax encore nécessaires pour être un
Part[] Parts
à ICollection<Part> Parts
? Et pouvez-vous afficher la définition de classe pour Part
?Essayez-les maintenant. Le cadre est simple POCO avec le public { get; set; } accessoires
Ne
Part
avoir un constructeur sans paramètre?ICollection n'a pas de résoudre le problème de liaison. Il ne disposait pas d'avoir un constructeur sans paramètre, mais j'ai juste essayé avec un et toujours pas aller (essayé avec ICollection).
Est-ce appel Ajax encore nécessaires pour être un
Get
?OriginalL'auteur parliament | 2013-07-10
Vous devez vous connecter pour publier un commentaire.
Question centrale ici est que MVC et WebApi utilisation de modèles différents liants. Même les interfaces de base sont différentes.
Lorsque vous envoyez des données avec votre $.appel ajax, vous envoyez suivantes paramètres de chaîne de requête:
Tout, le bon format à lier avec MVC modèle de classeur par défaut a autre convention de nommage pour les noms de paramètre:
Donc, l'appel de cette méthode devrait fonctionner:
Vous avez besoin pour construire votre chaîne de requête respectant le modèle MVC liant les conventions de nommage.
En outre
[FromUri]
attribut dans votre exemple, l'action est complètement ignorée, car elle ne sait pas à MVC DefaultModelBinder.Regex est suffisamment propre solution donc je vais marquer le vôtre réponse, car il a de la valeur quand même. Mais si quelqu'un peut effectivement répondre à la vraie question de la façon de faire FromUri travail en MVC, je vais marquer. Thanky ou
Je pense faire de l'API Web de liaison travail dans le contrôleur MVC serait un énorme effort. Les Pipelines sont complètement différents et pour appeler l'API Web de liaison vous devez instancier correctement tas de niveau inférieur web-api des objets spécifiques (HttpControllerDescriptor, HttpActionDescriptor, ModelBindingContext, etc).
OriginalL'auteur Nenad