我想从生产中的子域开始提供静态内容。在Visual Studio中保持平滑的开发体验的同时,最好的方法是什么?到目前为止,我不必担心URL,我只会使用:
<script src="@Url.Content("~/Scripts/jquery.someScript.js")" type="text/javascript"></script>
当我在本地时,它会自动映射到http://localhost/myApp/Scripts/jquery.someScript.js,当我投入生产时,它会自动映射到http://www.myDomain.com/Scripts/jquery.someScript.js。我不需要做任何事情来管理URL。
我的第一直觉是在我的web.config中使用一些AppSettings并指定HostName和StaticHostName,但这会破坏我对Url.Content的使用。
解决此问题的最佳做法是什么?
答案 0 :(得分:2)
某处,您需要使用配置设置来指示在给定环境中需要哪种行为(我想您可以使用IsDebuggingEnabled属性,但自定义配置设置更灵活。)
我可以想到两种可能的技巧。
选项1
您可以为UrlHelper
编写自己的扩展方法,以获取相关的配置设置。然后,您的视图代码将与配置知识隔离开来,例如:
<script src="@Url.StaticContent("~/Scripts/jquery.someScript.js")" type="text/javascript"></script>
这是一个示例实现(未经测试):
public static class UrlHelperExtensions
{
public static string StaticContent(this UrlHelper urlHelper, string contentPath)
{
if (!VirtualPathUtility.IsAppRelative(contentPath))
{
throw new ArgumentException("Only use app relative paths");
}
// TODO: Further checks required - e.g. the path "~" passes the above test
if (UseRemoteServer)
{
// Remove the initial "~/" from the content path
contentPath = contentPath.Substring(2);
return VirtualPathUtility.Combine(RemoteServer, contentPath);
}
return urlHelper.Content(contentPath);
}
private static string RemoteServer
{
get
{
// TODO: Determine based on configuration/context etc
return null;
}
}
private static bool UseRemoteServer
{
get
{
return !string.IsNullOrWhiteSpace(RemoteServer);
}
}
}
选项2
另一种方法可能是使用Combres之类的东西,但可以通过转换Combres的XML配置文件来修改每个环境的配置。