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()
fonte
2015-05-07 12:00:06
Questo funziona, ma penso che sia una migliore idea di non mettere i file js nella cartella Visualizzazioni. – ErikE
È 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
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. –