2008-09-17 5 views
4

Par exemple, si j'ai une page située dans Views/Home/Index.aspx et un fichier JavaScript situé dans Views/Home/Index.js, comment faites-vous référence sur la page aspx?Comment référencer les fichiers .js situés dans les dossiers View à partir d'une page en utilisant Asp.net MVC

L'exemple ci-dessous ne fonctionne pas, même si le compilateur dit que le chemin est correct

<script src="Index.js" type="text/javascript"></script> 

L'exactement la même question a été posté ici plus en détail: http://forums.asp.net/p/1319380/2619991.aspx

Si ce n'est pas actuellement possible, sera-t-il dans le futur? Si non, comment tout le monde gère ses ressources javascript pour les grands projets Asp.net MVC? Est-ce que vous créez simplement une structure de dossier dans le dossier de contenu qui reflète votre structure de dossier de vue? YUCK!

Répondre

1

Pour les ressources javascript partagées à l'aide du dossier de contenu est logique. Le problème était que j'essayais spécifiquement de résoudre le javascript spécifique à la page ASPX qui ne serait jamais réutilisé.

Je pense que ce que je vais devoir faire est de mettre le javascript spécifique à la page aspx directement sur la page elle-même et de garder les ressources js partagées dans le dossier Content.

+0

Je suis à la recherche de la même approche que vous. Avez-vous trouvé autre chose que de bourrer dans la page ou d'ajouter au contenu dir? – Owen

+0

Je viens de frapper ce même problème aujourd'hui. Complètement d'accord avec votre "YUCK" dans votre message original. Mais le mettre sur la page elle-même est encore plus dégueulasse je pense! Mes premiers réflexions ont été que le routage empêchait la diffusion des fichiers js sous le dossier Views. Avez-vous réussi à résoudre cela à la fin? –

3

Vous pouvez utiliser la méthode VirtualPathUtility.ToAbsolute comme ci-dessous pour convertir l'application URL relative du fichier .js à un absolu qui peut être écrit à la page:

<script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script> 
+0

J'ai essayé et il ne semble pas fonctionner. Il génère ce que je pense être l'URL correcte, mais pour une raison quelconque n'est pas capable de trouver le fichier js. – Vyrotek

1

Vous devriez avoir séparé la structure des dossiers pour les scripts. Par exemple, un dossier JavaScript sous la racine de l'application. Le stockage de fichiers js avec des vues n'affecte pas seulement les problèmes de résolution de chemin, mais affecte également la sécurité et les permissions. Il est également beaucoup plus facile d'intégrer ultérieurement des fichiers JS en tant que ressources d'assemblage si vous décidez de déployer certaines de vos parties d'application séparément à l'avenir lorsqu'elles sont stockées dans un sous-dossier dédié.

1

est ici une belle méthode d'extension pour HtmlHelper:

public static class JavaScriptExtensions 
{ 
    public static string JavaScript(this HtmlHelper html, string source) 
    { 
     TagBuilder tagBuilder = new TagBuilder("script"); 
     tagBuilder.Attributes.Add("type", "text/javascript"); 
     tagBuilder.Attributes.Add("src", VirtualPathUtility.ToAbsolute(source)); 
     return tagBuilder.ToString(TagRenderMode.Normal); 
    } 
} 

utiliser comme ceci:

<%=Html.JavaScript("~/Content/MicrosoftAjax.js")%> 
0

Si vous Recâbler vos pages à une coutume RouteHandler, vous pouvez vérifier l'existence de fichiers avant de gérer le RequestContext à la classe MvcHandler.

Exemple (non complet):

public class RouteHandler : IRouteHandler 
{ 
    public IHttpHandler 
    GetHttpHandler(RequestContext requestContext) 
    { 
     var request = requestContext.HttpContext.Request; 

     // Here you should probably make the 'Views' directory appear in the correct place. 
     var path = request.MapPath(request.Path); 
     if(File.Exists(path)) { 
      // This is internal, you probably should make your own version. 
      return new StaticFileHandler(requestContext); 
     } 
     else { 
      return new MvcHandler(requestContext); 
     } 
    } 
} 
Questions connexes