2010-02-18 10 views
2

J'ai un projet Microsoft MVC avec une action "Foo" dont la vue ("Foo.aspx") contient les lignes:Html.ActionLink() me donne un lien vide quand je l'utilise dans Html.RenderAction()

<%= Html.ActionLink("mylinktext1", "bar") %> 
<%= Html.ActionLink<MyController>(x => x.Bar(), "mylinktext2") %> 

quand je frappe ce à partir d'un navigateur Web ou le charger à partir d'un appel AJAX, il retourne correctement:

<a href="/bar">mylinktext1</a> 
<a href="/Bar">mylinktext2</a> 

Mais quand je l'appelle l'action d'une autre vue comme celui-ci:

<% Html.RenderAction<MyController>(x => x.Foo()); %> 

Ensuite, les liens sont rendus sans cibles. Pourquoi cela se produirait-il, et comment je contournerais ce problème?

Répondre

2

Je ne sais pas si c'est ce que vous faites mal, mais je n'ai jamais utilisé Html.RenderAction avec des actions qui retournent des vues ASPX. Lorsque j'appelle RenderAction, je m'assure que j'appelle une action de contrôleur qui renvoie ASCX View User Control.

Typiquement, le fichier .ASPX est une page entière et vous ne pouvez pas (ne devriez pas) le rendre dans une autre page. Donc je pense que vous devriez le rendre View User Control (ASCX) et le mettre soit dans Shared ou dans le dossier de vue du contrôleur.

Basé sur votre commentaire: Bien sûr, c'est bien. Vous venez de renvoyer vos données en tant que modèle à vos vues/afficher les contrôles utilisateur. Lorsque vous les chargez via AJAX, vous devez envisager d'appliquer Render View to String. Recherchez le Google ou Stack pour plus d'informations à ce sujet. Vous pouvez également rechercher une chose appelée attribut JsonPox pour vos méthodes d'action - également mis en œuvre quelque part sur Internet. Il permettra de décorer vos méthodes d'action afin qu'elles soient capables de renvoyer l'affichage HTML, XML ou JSON si c'est ce dont vous pourriez avoir besoin.

+0

Est-il logique d'avoir des actions AJAX qui retournent des vues de contrôle utilisateur? Mon projet comporte des actions qui devraient être directement accessibles par HTTP, mais je souhaite également que l'accès se fasse à partir des autres pages. Par exemple, disons que j'ai un appel AJAX pour mettre à jour dynamiquement une partie d'une page, mais quand cette page est rendue, je veux incorporer cette partie de la page sans appeler l'action, car l'action de la page a déjà calculé toutes les valeurs L'action AJAX devrait être calculée. La page peut simplement remplir les variables dans le partiel. Est-ce une chose sensée à faire? –

+0

J'ai basculé mon fichier .aspx vers un fichier .ascx, et le même problème persiste. <% = Html.ActionLink ("mylinktext1", "bar")%> affiche un lien avec href = "". –

+0

Aha. En utilisant <% Html.RenderAction (x => x.Foo()); %> provoque le problème. En utilisant <% Html.RenderAction ("Foo", "MyController"); %> fonctionne bien. Pourquoi la version typée échouerait-elle et la version magic-strings fonctionnerait-elle? –