3

我想开始从生产中的子域提供我的静态内容。在 Visual Studio 中保持流畅的开发体验的同时,最好的方法是什么?到目前为止,我不必担心 URL,我只需使用:

<script src="@Url.Content("~/Scripts/jquery.someScript.js")" type="text/javascript"></script>

当我在本地时,它会自动映射到http://localhost/myApp/Scr​​ipts/jquery.someScript.js,当我投入生产时,它会自动映射到http://www.myDomain.com/Scripts/jquery .someScript.js。我不需要做任何事情来管理 URL。

我的第一直觉是在我的 web.config 中使用一些 AppSettings 并指定 HostName 和 StaticHostName,但这会破坏我对 Url.Content 的使用。

解决此问题有哪些最佳实践?

4

1 回答 1

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 配置文件来修改每个环境的配置。

于 2011-11-06T23:34:34.273 回答