web-dev-qa-db-fra.com

comment asp.net mvc relie-t-il une vue à une action de contrôleur?

J'ai ouvert un exemple de projet ASP.NET MVC.

Dans HomeController j'ai créé une méthode (action) nommée MethodA

public ActionResult MethodA()
{
    return View();
}

J'ai fait un clic droit sur MethodA et créé une nouvelle vue appelée MethodA1

Refaites-le et créez une nouvelle vue appelée MethodA2.

  1. Comment se fait cette relation magique? J'ai cherché la configuration pour indiquer au compilateur que les vues MethodAX sont liées à l'action MethodA, mais n'en ai trouvé aucune.

  2. Quelle vue le contrôleur retournera-t-il lorsque MethodA sera appelé?

36
Elad Benda

La convention est la suivante: si vous ne spécifiez pas de nom de vue, la vue correspondante sera le nom de l'action. Alors:

public ActionResult MethodA()
{
    return View();
}

rendra ~/Views/ControllerName/MethodA.cshtml.

Mais vous pouvez aussi spécifier un nom de vue:

public ActionResult MethodA()
{
    return View("FooBar");
}

et maintenant la vue ~/Views/ControllerName/FooBar.cshtml sera rendue. 

Ou vous pouvez même spécifier un nom de vue complet qui ne se trouve pas dans le dossier des vues du contrôleur actuel:

public ActionResult MethodA()
{
    return View("~/Views/Foo/Baz.cshtml");
}

Maintenant, évidemment, tout cela suppose que Razor soit un moteur de visualisation. Si vous utilisez WebForms, remplacez .cshtml par .aspx ou .ascx (si vous travaillez avec des partiels).

Par exemple, s'il n'y a pas de vue, elle vous indiquera même où et dans quel ordre recherche les vues:

enter image description here

Rappelez-vous: ASP.NET MVC est entièrement une convention sur la configuration.

53
Darin Dimitrov

La structure MVC utilise la convention sur la configuration. L'infrastructure appelle le ExecuteResult sur l'objet ViewResult (créé par le retour View ();). Le cadre par convention cherche ensuite dans plusieurs endroits pour trouver une vue.

Si vous utilisez des zones, la structure recherchera une vue dans les emplacements suivants.

  • /Areas//Views/ControllerName/ViewName.aspx
  • /Areas//Views/ControllerName/ViewName.ascx
  • /Areas//Views/Shared/ViewName.aspx
  • /Areas//Views/Shared/ViewName.ascx
  • /Areas//Views/ControllerName/ViewName.cshtml
  • /Areas//Views/ControllerName/ViewName.vbhtml
  • /Areas//Views/Shared/ViewName.cshtml
  • /Areas//Views/Shared/ViewName.vbhtml

Sans zones (ou si vous utilisez des zones et qu'aucune vue n'a été trouvée), la structure examinera les emplacements suivants.

  • /Views/ControllerName/ViewName.aspx
  • /Views/ControllerName/ViewName.ascx
  • /Views/Shared/ViewName.aspx
  • /Views/Shared/ViewName.ascx
  • /Views/ControllerName/ViewName.cshtml
  • /Views/ControllerName/ViewName.vbhtml
  • /Views/Shared/ViewName.cshtml
  • /Views/Shared/ViewName.vbhtml

Dès que le Framework teste un emplacement et trouve un fichier, la recherche s'arrête, .__ et la vue trouvée sont utilisées pour restituer la réponse au client.

Il existe un certain nombre de versions remplacées de la méthode View. La plus courante consiste à rendre une vue spécifique, en dehors de la convention-cadre, en l'appelant par son nom. Par exemple

return View("~/Views/AnotherIndex.cshtml");

En tant que note de bas de page intéressante, le cadre recherche les vues ASP, C # et VB Razor existantes (aspx, ascx, cshtml et vbhtml), même si vous disposez d'un moteur d'affichage spécifique.

10
AlexC

Dans le contrôleur MVC, l'action du contrôleur n'est pas liée à la visualisation . Il utilise un mécanisme de délégation pour extraire la vue.

Liaison de modèles (mappage)

0
Shahaji

Je cherchais la même chose et je viens de faire quelques tests et de comprendre… .. Cela ne sauve nulle part… .. Pour comprendre comment cela fonctionne; Il suffit de faire ces étapes:

Dans votre contrôleur, cliquez avec le bouton droit de la souris sur Ajouter une vue Ensuite, entrez un nom de vue différent Et Ctrl F5Vous obtiendrez une erreur du serveur dans l'application.

Par exemple, si vous cliquez avec le bouton droit de la souris sur Ajouter une vue dans la méthode d'action Index suivante et que vous tapez "Index2" dans le nom de la vue, vous obtiendrez l'erreur.

public class TestController : Controller
{
    // GET: Test
    public ActionResult Index()
    {
        return View();
    }
}

Il existe donc une correspondance 1-1 entre le nom de l'action et le nom de la vue. Et vous ne pouvez pas ajouter de vue pour la même méthode, vous n'avez donc pas besoin de sauvegarder dans un fichier de configuration.

Modifiez maintenant le nom du fichier de vue dans Visual Studio de Index2.cshtml à Index.cshtml, puis Ctrl + F5. Vous devriez voir que ça marche.

0
Salim