2012-03-08 18 views
10

Sto cercando di posizionare i miei file javascript con le mie viste.Inserimento di file js nella cartella Viste

Ho la seguente posizione del file js. /Views/Home/Home.js

Tuttavia, quando si fa riferimento a un tag di script, risulta un errore 404.

Come per la seguente domanda SO: ASP.NET MVC - Where do you put your .js files if you dont want to store them in /Scripts?

ho aggiunto ai miei file.js percorsi Registra. (Non hanno risolto il problema)

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{file}.js"); 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    } 

Come posso archiviare e fare riferimento i miei file js accanto al mio punto di vista?

risposta

24

Il problema è che, per motivi di sicurezza, il web.config che si trova all'interno della cartella Views blocca tutte le richieste ai file in quella cartella. Questo è quello che troverete nel file di configurazione:

<httpHandlers> 
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

E per IIS7:

<handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 

Soluzione

È possibile modificare il carattere jolly prendere solo t he file .cshtml.

<httpHandlers> 
    <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 

<handlers> 
    <remove name="BlockViewHandler"/> 
    <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
</handlers> 

Con questo jolly, i file .js non verranno bloccati.

+1

Questo funziona, ma penso che sia una migliore idea di non mettere i file js nella cartella Visualizzazioni. – ErikE

+2

È indubbiamente più sicuro inserire nella lista bianca i file che si desidera esplicitamente consentire come indicato nella risposta all'indirizzo http://stackoverflow.com/questions/604883/where-to-put-view-specific-javascript-files-in-an-asp -net-mvc-application piuttosto che solo richieste di filtro per i file cshtml. – pwdst

+1

Per quanto mi riguarda, ho creato una configurazione MVC che fa un uso intensivo dell'angolare. Ho anche AMD avuto tutto ciò che richiede js, quindi solo le viste che usano determinati pezzi javascript causano il caricamento di quei file di script java. In quanto tale ho suddiviso in compartimenti tutto e ha molto senso mettere il controller angolare associato a una cartella mvc nella cartella con la vista. Quindi ho qualcosa come viste \ ControllerName \ ControllerName.cshtml e views \ Controller \ ControllerName-controller.js. –

2

Personalmente non mi piace giocare con httpHandlers per motivi di sicurezza. Volevo fare la stessa identica cosa per evitare di dover mantenere la stessa struttura di cartelle due volte (in vista e nella cartella degli script). Quindi, l'obiettivo è archiviare i file .js nella stessa cartella del mio .cshtml e non avere più l'errore 404.

Soluzione

Per raggiungere questo obiettivo, io uso un HtmlHelper personalizzato e di un controller per JavaScript chiama.

HtmlHelper

public static MvcHtmlString JScriptBlock<TModel>(
     this HtmlHelper<TModel> html 
    ) 
    { 
     // Get the physical path of the .js file we are looking for. 
     string path = ((System.Web.Mvc.RazorView)html.ViewContext.View).ViewPath.Replace(".cshtml", ".js"); 
     path = HostingEnvironment.MapPath(path); 

     if (!File.Exists(path)) 
      return null; 

     // We store the physical path in a session variable with GUID as the key 
     string guid = Guid.NewGuid().ToString(); 
     HttpContext.Current.Session[guid] = path; 

     // Create the script block where the src points to the JScript controller. We give the GUID as parameter. 
     return MvcHtmlString.Create("<script src='/JScript/?id=" + guid + "'/>"); 

    } 

JScript controller

public ActionResult Index(string id) 
    { 
     // id correspond to the guid generated by the MSRJScript helper 

     // We look if the physical path of the .js is available in the session variables 
     if(Session[id] == null) 
      return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

     // If the physical path was found, we simply send the file back to the browser. 
     string path = Session[id].ToString(); 
     Session.Remove(id); 

     return File(path, "application/javascript"); 
    } 

Una volta fatto, è sufficiente aggiungere il seguente codice nel tuo Vista/PartialView

@Html.JScriptBlock() 
+0

In realtà mi piace questo, ma non è più lento ottenere quei file statici dal momento che passa attraverso molti metodi e invocatori di mvc fino a raggiungere il vero file? –

1

Nella mia opinione, questo è un buon modo: mantiene il codice semplice e non tocca il problema di sicurezza con altri tipi di risorse.

Basta aggiungere il seguente nei gestori sezione:

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" /> 
Problemi correlati