Otra solución es la prestación de sus archivos JS completamente a través de RazorViewEngine. De esta manera usted puede fácilmente utilizar la maquinilla de afeitar de sintaxis en el archivo de Javascript:
public class CustomRazorViewEngine : BuildManagerViewEngine
{
internal static readonly string ViewStartFileName = "_ViewStart";
public CustomRazorViewEngine()
: this(null)
{
}
public CustomRazorViewEngine(IViewPageActivator viewPageActivator)
: base(viewPageActivator)
{
AreaViewLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/{1}/{0}.csjs",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.csjs"
};
AreaMasterLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/{1}/{0}.csjs",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.csjs"
};
AreaPartialViewLocationFormats = new[]
{
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/{1}/{0}.vbhtml",
"~/Areas/{2}/Views/{1}/{0}.csjs",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.vbhtml",
"~/Areas/{2}/Views/Shared/{0}.csjs"
};
ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/{1}/{0}.csjs",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml",
"~/Views/Shared/{0}.csjs"
};
MasterLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/{1}/{0}.csjs",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml",
"~/Views/Shared/{0}.csjs"
};
PartialViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/{1}/{0}.csjs",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml",
"~/Views/Shared/{0}.csjs"
};
FileExtensions = new[]
{
"cshtml",
"vbhtml",
"csjs",
};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
return new RazorView(controllerContext, partialPath,
layoutPath: null, runViewStartPages: false, viewStartFileExtensions: FileExtensions,
viewPageActivator: ViewPageActivator);
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var view = new RazorView(controllerContext, viewPath,
layoutPath: masterPath, runViewStartPages: true, viewStartFileExtensions: FileExtensions,
viewPageActivator: ViewPageActivator);
return view;
}
}
en su archivo asax global sólo tiene que añadir los siguientes:
RazorCodeLanguage.Languages.Add("csjs", new CSharpRazorCodeLanguage());
ViewEngines.Engines.Add(new CustomRazorViewEngine());
y añadir a la cartografía en la raíz web.config
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="Newtonsoft.Json" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
<!--Added-->
<buildProviders>
<add extension=".csjs" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
</buildProviders>
¡Ahora puede incluso trabajar con un Modelo dentro de su archivo javascript!
public ActionResult MyJavascriptThroughRazor()
{
var someModel = ...
return PartialView("filenamewithcsjsextension",someModel);
}
¡Bonita idea! ¡Gracias! Improvisé esto creando el script usando un helper html, ya que mis scripts deben ser inyectados en múltiples diseños, ¡gracias de nuevo! – k25
"~ /" ya termina con un "/" - si agrega los dos juntos, terminará con "//" al comienzo de sus URL. Todavía debería funcionar, pero es más elegante escribir simplemente (ROOT + 'Content/Images/Image.png'); – BrainSlugs83
¿Cómo harías esto para una imagen CSS? –