MVC WebApi HttpGet avec des objets complexes
J'ai déjà un WebApi action, que je veux changer de HttpPost à HttpGet. Il faut actuellement un seul objet complexe comme paramètre.
Le modèle:
public class BarRequest
{
[JsonProperty("catid")]
public int CategoryId { get; set; }
}
Le contrôleur:
public class FooController : ApiController
{
//[HttpPost]
[HttpGet]
[ActionName("bar")]
public void Bar([FromUri] BarRequest request)
{
if (request != null)
{
//CategoryId should be 123, not 0
Debug.WriteLine("Category ID :: {0}", request.CategoryId);
}
}
}
Maintenant, quand je envoyer la requête suivante, tout fonctionne comme prévu.
GET /foo/bar?CategoryId=123
Également l'ancien POSTE demande a fonctionné comme prévu.
POST /foo/bar {"catid":123}
Mais maintenant j'ai besoin de la suite de la demande de travail:
GET /foo/bar?catid=123
Comment puis-je y arriver?
- Pourquoi ne pas simplement utiliser le code de catégorie pour ce faire? Ou pourquoi ne pas utiliser CatID comme le nom de la propriété, ou de l'utilisation CatID en tant que paramètre à la méthode?
- Le modèle réel a beaucoup plus de propriétés. Propriété de nommage ne peut pas être changé (de l'intitulé de chaque côté - serveur/c# et client/js).
Vous devez vous connecter pour publier un commentaire.
Merci pour les suggestions, mais la seule solution qui fonctionne pour moi, est la suivante.
Avant:
Après:
De cette façon, je n'ai pas besoin de toucher à un modèle, validateur, etc. sur le client ou le serveur. En outre, toutes les autres solutions m'a obligé à modifier les conventions de nommage sur le serveur ou côté client.
vous pouvez le faire en utilisant datacontracts et datamember attribut:
http://msdn.microsoft.com/en-us/library/ms733127.aspx
si c'est une méthode Post
mais avec la méthode get ceci est un exemple de structure pour les objets complexes :
JsonConvert.DeserializeObject<BarRequest>(json);
?Il y a une méthode d'extension sur
URI
dansSystem.Net.Http.UriExtensions
qui va faire exactement ce que vous voulez:TryReadQueryAs<T>(out T model)
. Vous pouvez obtenir de l'URI de votre demande dans un ApiController:Request.RequestUri
. Voici à quoi ça ressemblera:Cela ne fonctionne que si vous spécifiez un
[DataContract]
comme Joan suggéré.Toutefois être conscients qu'un vide de chaîne de requête analyse, donc, si vous avez utilisé pour faire quelque chose de différent selon que les données a été
POST
ed ou non, vous aurez besoin de vérifier la validité de votre modèle. Espérons que vous faisiez que de toute façon si.