web-dev-qa-db-fra.com

Quel est l'équivalent WebApi [FromUri] dans ASP.NET MVC?

Dans WebApi, je peux décorer un paramètre sur une action de contrôleur avec [FromUri] pour que les composants de l'URI soient "désérialisés", si vous voulez, dans un modèle POCO; aka liaison de modèle.

Malgré l'utilisation de MVC depuis 2.0, je ne l'ai jamais utilisé pour des sites Web (je ne sais pas pourquoi). Quel est son équivalent dans ASP.NET MVC 5?

L'attribut ne semble pas être reconnu dans le IDE sauf si j'ai besoin de référencer une bibliothèque.

J'aimerais ~/thing/2014/9 pour se lier au modèle ci-dessous:

public class WhateverModel
{
    public int Year { get; set; }
    public int Month { get; set; }
}

Merci

Mettre à jour

Dans l'autre question (lien ci-dessus), le PO dit:

Cependant, passez à MVC brut et non à WebApi et le classeur de modèle par défaut tombe en panne et ne peut pas lier les propriétés sur les objets du tableau imbriqué

Ce qui implique qu'il utilise l'attribut du WebApi. J'imagine. Je n'ai pas ces références, parce que je suis dans MVC, est-ce que (ab) utiliser la version de WebApi est le moyen accepté de le faire dans MVC?

Update 2

Dans la réponse à cette question est:

Vous devez construire votre chaîne de requête en respectant les conventions de dénomination du classeur de modèle MVC.

Aditionellement [FromUri] l'attribut de votre exemple d'action est complètement ignoré, car il n'est pas connu de MVC DefaultModelBinder

Donc je ne sais toujours pas quoi faire ou quoi sur Terre le PO parlait même dans cette question, s'il obtenait un certain succès avec le mauvais attribut.

Je suppose que j'espère une réponse claire et non la boue de cette autre question.

22
Luke Puplett

Ça va juste marcher ™:

[HttpGet]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

Au moins, lors de l'utilisation de l'URL /thing?Year=2014&Month=9.

Le problème est votre routage. L'URL /thing/2014/9 ne sera pas mappé en utilisant la route par défaut de MVC, car c'est /{controller}/{action}/{id}, où {id} est un int facultatif.

Le plus simple serait d'utiliser le routage d'attributs:

[HttpGet]
[Route("/thing/{Year}/{Month}"]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

Cela mappera l'URL à votre modèle.

30
CodeCaster