2010-07-23 12 views
0

Je travaille sur un site qui a des routes vers des actions qui rendent des vues partielles. Beaucoup de ces vues partielles sont des composants qui forment ensemble une page complète. Par exemple sur une page de recherche que je travaille sur a une zone de texte, une liste d'onglets, et une table.Est-il possible d'empêcher certaines consultations partielles d'être servies si elles sont demandées directement?

Seach de ceux-ci peuvent y accéder avec une URL semblable à

/Search/SearchPanel 
/Search/Tabs/{SearchTerm} 
/Search/ResultsTable/SearchTerm?tab=[currently selected tab] 

et ceux-ci sont tous rendus avec un RenderPartial sur ma page d'index. Lorsque la page se charge, elle affiche chacun de ces composants comme je le veux.

Mais pour l'instant il n'y a rien qui empêche un utilisateur d'aller directement à l'url

/Search/Tabs 

pour rendre seul un contrôle onglet qui n'a pas de sens en dehors du contexte du reste des éléments sur la page.

Y a-t-il un moyen pour moi d'empêcher cela?

Répondre

0

Avez-vous essayé de marquer votre méthode de contrôleur comme private?

private PartialViewResult MyPartialResultMethod() 

Cela devrait vous permettre de l'appeler à partir de votre code pour construire vos pages et interdire l'accès public comme par un URl.

Je suis en train de tester cela maintenant pour être sûr que ma réponse est correcte, donc je vais mettre à jour comme je l'ai testé.

Dans votre exemple d'onglets, vous pouvez simplement restreindre l'accès en utilisant une seconde méthode de contrôleur pour les onglets privés.

Donc, vous auriez quelque chose qui ressemble à:

public ActionResult Tabs(string searchTerm) // When a search term is passed. 

et

private ActionResult Tabs() // When no search term is passed. 
0

Vous pouvez créer un ActionFilter qui vérifie si le Request.IsAjaxRequest() est vrai. Si ce n'est pas le cas (ce qui signifie que l'utilisateur appelle directement la vue), redirigez-la en conséquence.

+0

J'ai aimé cela, et cela s'est avéré prometteur, jusqu'à ce que grâce à l'expérimentation, j'ai découvert que les appels angularJs à templateUrl dans les directives ne sont pas des requêtes ajax. Et bien sûr, ce ne sont pas des actions pour enfants non plus. Donc pas moyen de bloquer l'accès direct aux partiels dont vous avez besoin pour angularJs. – Brad