MVC Razor, inclure les fichiers JS / CSS d'un autre projet

j'ai un projet C# MVC qui utilise la syntaxe Razor.

Pour pouvoir réutiliser un peu de code, je veux mettre certains de mes fichiers JavaScript et CSS dans un autre projet et les inclure d'une façon ou d'une autre.

Voici comment mes scripts sont inclus en ce moment:

<script src="@Url.Content("~/Scripts/bootstrap-typeahead.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/bootstrap-dropdown.js")" type="text/javascript"></script>

pour le moment, les scripts sont dans le même projet que le fichier cshtml mais ils devraient être placés dans le fichier commun.Web project à la place...

Ce que je veux faire est ceci (ne fonctionne pas bien qu'):

<script src="@Url.Content("Common.Web/Scripts/bootstrap-typeahead.js")" type="text/javascript"></script>
<script src="@Url.Content("Common.Web/Scripts/bootstrap-dropdown.js")" type="text/javascript"></script>
16
demandé sur Stephen Kennedy 2012-08-07 13:29:29

4 réponses

je fais cette chose même. Cependant j'ai incorporé les fichiers Javascript et d'autres contenus dans une autre DLL et puis les appeler de ma syntaxe de rasoir comme ça. Voici le code que j'utilise. Dans la vue: Exemple de Script:

        <script src=@Url.Action("GetEmbeddedResource", "Shared", new { resourceName = "Namespace.Scripts.jquery.qtip.min.js", pluginAssemblyName = @Url.Content("~/bin/Namespace.dll") }) type="text/javascript" ></script>

Exemple D'Image:

@Html.EmbeddedImage("corporate.gif", new { width = 150, height = 50})

Voici mes méthodes d'aide:

        public static MvcHtmlString EmbeddedImage(this HtmlHelper htmlHelper, string imageName, dynamic htmlAttributes)
    {
        UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
        var anchor = new TagBuilder("img");
        anchor.Attributes["src"] = url.Action("GetEmbeddedResource", "Shared",
                                              new
                                                  {
                                                      resourceName = "Namespace.Content.Images." + imageName,
                                                      pluginAssemblyName = url.Content("~/bin/Namespace.dll")
                                                  });

        if (htmlAttributes != null)
        {
            string width = "";
            string height = "";
            PropertyInfo pi = htmlAttributes.GetType().GetProperty("width");
            if (pi != null)
                width = pi.GetValue(htmlAttributes, null).ToString();

            pi = htmlAttributes.GetType().GetProperty("height");
            if (pi != null)
                height = pi.GetValue(htmlAttributes, null).ToString();

            if (!string.IsNullOrEmpty(height))
                anchor.Attributes["height"] = height;

            if (!string.IsNullOrEmpty(width))
                anchor.Attributes["width"] = width;
        }
        return MvcHtmlString.Create(anchor.ToString());
    }

enfin mon contrôleur partagé:

        [HttpGet]
    public FileStreamResult GetEmbeddedResource(string pluginAssemblyName, string resourceName)
    {
        try
        {
            string physicalPath = Server.MapPath(pluginAssemblyName);
            Stream stream = ResourceHelper.GetEmbeddedResource(physicalPath, resourceName);
            return new FileStreamResult(stream, GetMediaType(resourceName));
            //return new FileStreamResult(stream, GetMediaType(tempResourceName));
        }
        catch (Exception)
        {
            return new FileStreamResult(new MemoryStream(), GetMediaType(resourceName));
        }
    }

    private string GetMediaType(string fileId)
    {
        if (fileId.EndsWith(".js"))
        {
            return "text/javascript";
        }
        else if (fileId.EndsWith(".css"))
        {
            return "text/css";
        }
        else if (fileId.EndsWith(".jpg"))
        {
            return "image/jpeg";
        }
        else if (fileId.EndsWith(".gif"))
        {
            return "image/gif";
        }
        else if (fileId.EndsWith(".png"))
        {
            return "image/png";
        }
        return "text";
    }

Ressources Helper:

    public static class ResourceHelper
{
    public static Stream GetEmbeddedResource(string physicalPath, string resourceName)
    {
        try
        {
            Assembly assembly = PluginHelper.LoadPluginByPathName<Assembly>(physicalPath);

            if (assembly != null)
            {
                string tempResourceName = assembly.GetManifestResourceNames().ToList().FirstOrDefault(f => f.EndsWith(resourceName));
                if (tempResourceName == null)
                    return null;
                return assembly.GetManifestResourceStream(tempResourceName);
            }
        }
        catch (Exception)
        {

        }

        return null;
    }
}  

Plugin Helper

public static T LoadPluginByPathName<T>(string pathName)
{
    string viewType = typeof(T).GUID.ToString();

    if (HttpRuntime.Cache[viewType] != null)
        return HttpRuntime.Cache[viewType] is T ? (T)HttpRuntime.Cache[viewType] : default(T);

    object plugin = Assembly.LoadFrom(pathName);
    if (plugin != null)
    {
        //Cache this object as we want to only load this assembly into memory once.
        HttpRuntime.Cache.Insert(viewType, plugin);
        return (T)plugin;
    }

    return default(T);
}

rappelez-vous que j'utilise ces contenus!

12
répondu retslig 2012-09-04 13:30:03

a ma connaissance, vous ne pouvez pas faire cela car le chemin se trouve en dehors du site.

toutefois, Vous pouvez effectuer les opérations suivantes:

1) Mettez tous les scripts que vous voulez partager en commun.Web \ Scripts

2) pour chaque fichier de script dans votre application web "Ajouter un Lien" à votre commune.Scripts Web (vous n'avez même pas besoin de faire cette étape; il est toutefois agréable de voir quels scripts votre application web utilise en VS)

3) Ajouter un post-build événement à votre application Web qui copie les scripts de Common.Web\Scripts pour votre WebApp\dossier Scripts:

copier $(ProjectDir)..\Commun.Web\Scripts* $(ProjectDir) \ Scripts

donc, de votre point de vue dans Visual Studio, vous n'aurez qu'un seul endroit pour mettre à jour votre .js fichiers qui peuvent être utilisés par plusieurs projets.

6
répondu wal 2012-08-07 12:17:50

au Lieu d'utiliser Url helper utiliser l'adressage relatif. Ce que vous avez essayé de faire n'a aucun sens, car helper est utilisé pour résoudre les chemins relatifs à son projet.

depuis que vous essayez d'utiliser les ressources d'un autre projet, il est normal de supposer que vous savez à l'avance où vous allez déployer chaque projet. Même si je n'aime pas cette pratique, je pense à une solution pragmatique pour cela.


Si vos deux applications sont à url:

http://www.mysite.com/app1
http://www.mysite.com/Common.Web

vous pourriez adresse comme ceci:

<script src="@Url.Content("~")/../Common.Web/Scripts/bootstrap-typeahead.js")" type="text/javascript"></script>

signification, résoudre mon dossier racine de l'application, monter un niveau, et descendre le reste du chemin.

1
répondu Nikola Radosavljević 2012-08-07 14:26:02

je viens de trouver cette question en cherchant la même réponse. Merci aux posters précédents, qui ont fait clairement savoir que cela ne peut pas être fait en utilisant Visual Studio seul: vous allez toujours finissez avec une copie du fichier original, ou un jeu incomplet de fichiers d'expédition.

Je ne souhaite pas réinventer la roue chaque fois que j'ai une fonctionnalité commune simple, donc j'ai un dossier pour les scripts communs sur mon disque dur: / Common / Javascript

Mon projet web est situé dans: /ProjectName

donc mes scripts communs se trouvent en dehors de mon projet web.

j'ai résolu le problème par contrôle source. La plupart des dépôts de contrôle des sources auront la fonctionnalité d'afficher un fichier dans un autre répertoire. Mes pas ont été:

  1. Créer un dossier vide sous mes VS projet: /Nom_projet/Scripts/Commune
  2. Commis le dossier vide de contrôle de code source
  3. en utilisant Subversion( mon contrôle source), j'ai configuré un "extern" de sorte que mon fichier commun était lié au nouveau dossier. D'autres logiciels de contrôle des sources peuvent appeler cela un "lien" ou quelque autre chose du genre.
  4. mise à jour du nouveau dossier, et mes fichiers Javascript courants sont arrivés, et peuvent maintenant être ajoutés à mon projet Web dans Visual Studio.

évidemment, j'ai testé ceci en changeant les fichiers de Visual Studio et en les commettant. Les modifications ont en effet été reflétées dans les fichiers originaux, se trouvant dans /Common/Javascript.

je peux maintenant il suffit d'ajouter un externe à tout autre projet web qui a besoin d'utiliser la même fonctionnalité: bien, bien sûr, changer ces fichiers vient avec un risque supplémentaire maintenant, que je peux briser de manière inattendue d'autres projets qui les utilisent. Si je peux configurer externe pour utiliser une révision spécifique d'un fichier, ce n'est pas ce que je veux faire en ce moment; j'attends une telle complexité, comme et quand il se produit.

-1
répondu Hamish 2016-01-14 11:41:28