Caricare un file javascript embedded da una libreria in un progetto ASP.NET MVC

Appunto qui per ricordarmene in futuro visto che ultimamente dimentico tutto: ho realizzato una libreria di classi in cui, oltre ad oggetti C#, sono presenti diversi file javascript il cui contenuto è necessario perché le classi possano funzionare correttamente. Per caricarli all’interno del progetto principale è necessario:

  1. selezionare il file javascript presente nel progetto libreria;
  2. dal menu contestuale (click destro del mouse), selezionare la voce Proprietà;
  3. nella finestra che compare modificare Build Action: Embedded Resource.
  4. nel file AssemblyInfo.cs della del progetto libreria aggiungere una nuova riga di codice:
[assembly:System.Web.UI.WebResource(
  "YourNamespace.Resource.js", 
  "application/x-javascript"
)]

A questo punto possiamo caricare il file javascript utilizzando ClientScript.GetWebResourceUrl(Type, resourceName).
Utilizzando ASP.NET MVC è necessario un ulteriore passaggio perché tutto funzioni correttamente: realizzare una classe che ci consenta di reperire direttamente l’URL del file javascript da poter includere nella nostra pagina web:

public static class ResLocator
{
  private const string UrlLocatorMethodName = "GetWebResourceUrlInternal";
  public static string Resolve(Type assemblyObjectType, string resourceName) 
  {
    MethodInfo resourceLocatorMethod = assemblyObjectType.GetMethod(UrlLocatorMethodName, 
    BindingFlags.NonPublic | BindingFlags.Static);
    string url = string.Format("/{0}", resourceLocatorMethod.Invoke(
      null,
      new object[] { Assembly.GetAssembly(assemblyObjectType), resourcePath, false })
    );
    return url;
  }
}

Il metodo Resolve accetta in input un Type che deve necessariamente riferirsi ad un tipo di oggetto contenuto nel progetto libreria e resourceName, cioè il nome della risorsa da includere. Successivamente, referenziando il namespace in cui è contenuto l’helper all’interno della nostra MasterPage, è possibile includere lo script di riferimento in questo modo:

<script 
  type="text/javascript" 
  src="@ResLocator.Resolve(typeof(SampleAssemblyObject), "YourNamespace.Resource.js)" />

Completati questi passaggi è possibile avviare l’app MVC e ottenere un URL simile al seguente:

/WebResource.axd?d=HWyLh7g77XD...Z81&t=634788092174760080