ASP.Net MVC et RenderPartial w / chemins relatifs
J'ai été jouer avec ASP.NET MVC et avait une question. Ou peut-être de son inquiétude que je fais c'est mal. Juste à travailler sur une lame de site pour étirer mes ailes un peu. Je suis désolé, cette question n'est pas du tout concis.
Ok, voici le scénario. Lorsque l'utilisateur visite à domicile/index, la page doit afficher une liste de produits et une liste d'articles. Le format du fichier est telle (DAL est ma couche d'accès aux données):
Contrôleurs La maison Index Vues La maison Index hérite de ViewPage Produit Liste hérite de ViewUserControl<IEnumerable<DAL.Produit>> Seul hérite de ViewUserControl<DAL.Produit> L'Article Liste hérite de ViewUserControl<IEnumerable<DAL.L'Article>> Seul hérite de ViewUserControl<DAL.L'Article>
Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerable<DAL.Product> and a IEnumerable<DAL.Article>.
View.Home.Index will use those view entries to call:
Html.RenderPartial("~/Views/Product/List.ascx", ViewData["ProductList"])
and Html.RenderPartial("~/Views/Article/List.ascx", ViewData["ArticleList"])
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
View.Article.List does something similar to View.Product.List
Cette approche ne parvient pas cependant. La démarche fait sens pour moi, mais peut-être quelqu'un avec plus d'expérience avec ces MVC plateformes de reconnaître une meilleure façon.
Ci-dessus produit une erreur à l'intérieur de la Vue.Produit.Liste. L'appel à Html.RenderPartial("Single",...)
se plaint que "Seule" vision n'a pas été trouvé. L'erreur indique:
La vue partielle "Unique" n'a pas pu être trouvé. Les emplacements suivants ont été recherchés: ~/Views/Home/Unique.aspx ~/Views/Home/Unique.ascx ~/Views/Shared/Unique.aspx ~/Views/Shared/Unique.ascx
Parce que j'ai été appeler RenderAction() à partir d'une vue du Produit, je m'attendais à l'exécution de regarder pour le "Simple" affichage dans les Vues\Produit. Il semble cependant que la recherche est relative: le contrôleur qui a invoqué la vue d'origine (/Contrôleur/Home invoquées /Vues/Produit) plutôt que de la vue actuelle.
Donc je suis en mesure de résoudre ce problème en changeant Vues\Produit, telles que:
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("~/Views/Product/Single.ascx", product);
au lieu de
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
Ce correctif fonctionne mais.. je ne comprends pas pourquoi j'ai besoin de spécifier le chemin complet de la vue. Il serait logique pour moi pour le nom relatif à interpréter par rapport à la vue actuelle du chemin plutôt que le contrôleur d'origine du chemin de la vue. Je ne vois pas de cas utile lorsque l'interprétation du nom par rapport au contrôleur de la vue au lieu de la vue en cours est utile (sauf dans le cas typique où ils sont les mêmes).
Autour de ce temps, je devrais avoir un point d'interrogation? Pour l'accent c'est vraiment une question.
source d'informationauteur Frank Schwieterman
Vous devez vous connecter pour publier un commentaire.
La partie je pense que vous êtes le malentendu est le "emplacement d'exécution" faute de mieux, ou le terme officiel. Les chemins ne sont pas par rapport à votre point de vue, pas même votre "contrôleur de vue" comme vous l'avez dit. Ils sont relatifs à votre demande d'URL, qui définit un contexte de contrôleur. Je ne peut pas dire qu'il est très bien, mais si vous avez passé un peu de temps dans un Réflecteur en regardant la façon dont les Url et les itinéraires sont résolus, je pense que ce serait tout tomber en place dans votre tête.
[edit:
Je pensais, vous avez 2 cas:
Dans le premier cas, le point de vue de l'utilisateur des contrôles vraiment appartenir à la maison de contrôleur et il est logique de les mettre dans la maison contrôleur de dossier. Dans le second cas, il est logique de les placer dans le dossier partagé, car ils seront partagés par les contrôleurs.
Dans les deux cas, peut-être que vous pouvez les placer dans un sous-dossier. Comme Views/Home/Produits et ensuite essayer RendarPartial("Produit Unique") et voir ce qui se passe? Je ne sais pas si elle serait d'essayer de le résoudre: Home/Produits/Unique, puis de les partager/Produit/Unique ou pas. Si les sous-dossiers de travail, il semble permettre à la logique de séparation du Produit et de l'Article, tout en montrant qu'ils sont toujours membres de la Maison de contrôleur ou Partagées par tous les contrôleurs.
]
Découvrez cette entrée de blog par Steve Sanderson:
http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/
Ce que vous faites n'est pas faux, mais il ne semble pas d'aller à l'encontre de la convention de Vue/Contrôleur de noms de dossier. Cela dit, il est logique de vouloir définir contrôleur indépendant afficher les commandes de l'utilisateur et de l'imbrication entre eux semble valide. Donc, je ne sais pas!
De toute façon, le lien juste décrit une méthode au lieu d'utiliser RenderPartial pour effectuer le rendu d'un contrôle de l'utilisation, il définit une méthode de RenderPartialRequest qui rend la valeur de retour (dans votre cas, un contrôle de l'utilisateur) d'une action du contrôleur. Ainsi, vous pouvez ajouter un Produit et d'Articles de contrôleur avec une Liste d'actions qui renvoie votre de contrôle de l'utilisateur, et ensuite appeler ces deux actions de la Maison/Indice point de vue. Cela semble plus intuitif pour moi, mais juste un avis.
Il mentionne aussi subcontrollers de MVC Contrib, et je suis assez sûr il y a le désir de quelque chose comme cela pour être une partie de ASP.NET MVC libération.
En regardant le MVCStoreFront exemple de cela est la façon dont ils ont tout structuré pour appeler RenderPartial
Rendre ensuite via: