我有一个使用剃刀语法C#MVC项目。
为了能够重复使用一些代码,我想把我的一些JavaScript和CSS文件在不同的项目,包括他们莫名其妙。
这是我的脚本是如何被包括在时刻:
<script src="@Url.Content("~/Scripts/bootstrap-typeahead.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/bootstrap-dropdown.js")" type="text/javascript"></script>
目前,该脚本是在同一个项目的CSHTML文件,但它们应该被放置在Common.Web项目,而不是...
我想要做的就是这个(虽然不工作):
<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>
我做的这事。 不过我嵌入的JavaScript文件,并在另一个DLL等内容,然后叫他们从我的剃刀语法像这样。 下面是我使用的代码。 在查看:脚本示例:
<script src=@Url.Action("GetEmbeddedResource", "Shared", new { resourceName = "Namespace.Scripts.jquery.qtip.min.js", pluginAssemblyName = @Url.Content("~/bin/Namespace.dll") }) type="text/javascript" ></script>
图像实施例:
@Html.EmbeddedImage("corporate.gif", new { width = 150, height = 50})
这里是我的辅助方法:
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());
}
最后我的共享控制器:
[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";
}
资源助手:
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;
}
}
插件助手
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);
}
请记住,我使用这些作为嵌入的内容!
据我所知,你不能这样做,因为路径会说谎的网站之外。
但是,您可以执行以下操作:
1)把所有要共享脚本Common.Web \脚本
2)对于Web应用程序的每个脚本文件“添加为链接”到你的Common.Web脚本( 你甚至不需要做这一步,它不过是很高兴看到什么脚本您的web应用程序中使用VS)
3)生成后事件添加到您的Web应用程序副本从Common.Web \ Scripts中的脚本到你的Web应用程序\ Scripts文件夹:
复制$(PROJECTDIR).. \ Common.Web \脚本* $(PROJECTDIR)\脚本
所以在Visual Studio中你的观点,你只会有一个地方更新可以由多个项目中使用您的.js文件。
而不是使用的Url
助手用相对寻址。 什么你试图这样做是没有意义的,因为助手是用来解决相对于它的项目路径。
既然你要使用另一个项目的资源,这是确定的假设,你知道前期你要去的地方部署每一个项目。 虽然我不喜欢这种做法,我能想到这个务实的解决方案。
如果两项申请,网址:
http://www.mysite.com/app1
http://www.mysite.com/Common.Web
你可以解决这样的:
<script src="@Url.Content("~")/../Common.Web/Scripts/bootstrap-typeahead.js")" type="text/javascript"></script>
这意味着,解决我的应用程序的根文件夹,升了一级,而往下走路径的其余部分。
我刚刚发现了这个问题,同时寻找相同的答案。 由于以前的海报,谁明确表示,这不能单独使用Visual Studio来完成:你将永远与原始文件的副本,或者一套运输文件不完整而告终。
我不希望重塑每当我有简单的常用功能的车轮,所以我有我的硬盘驱动器上常见的脚本文件夹:/通用/ JavaScript的
我的web项目位于:/项目名
所以我共同的脚本躺在我的web项目之外。
我通过源代码控制解决了这个。 大多数源代码控制库将不得不表现出另一个目录中的文件的功能。 我的步骤是:
- 在我的VS项目中创建空文件夹:/项目名/脚本/通用
- 犯下的空文件夹到源控制
- 使用Subversion(我的源代码控制),我建立了一个“外部”,让我共同文件链接到新的文件夹。 其他源代码控制软件可以称之为“链接”或其他一些这样的事情。
- 更新了新的文件夹,和我共同的JavaScript文件进来,现在可以添加到Visual Studio中我的web项目。
很显然,我改变Visual Studio中的文件,并承诺他们测试了这一点。 变化的确反映在原始文件,坐在/通用/ JavaScript的。
我现在一个外部简单地添加到需要使用相同的功能的任何其他网络项目:不过,当然,改变这些文件现在带有额外的风险,因为我可能会意外地打破其使用它们的其他项目。 虽然我可以配置一个外部使用文件的具体修改,这不是我想在这一点上做的; 因为当它发生时,我将等待这种复杂性。