渲染位于远程服务器上的部分视图

时间:2014-10-27 16:49:41

标签: asp.net-mvc razor asp.net-mvc-partialview

我有一台服务器,其中包含一些部分视图文件。 我如何从其他服务器加载文件到Html.Partial? 喜欢:

@Html.Partial("http://localhost/PartialServer/view/calculator.cshtml");

我可以覆盖部分以从网址加载吗?

Asp.net MVC是框架。

1 个答案:

答案 0 :(得分:5)

首先,在_RemotePartialsCache文件夹下创建一个名为~/Views/的新目录。

使用HtmlHelper方法扩展RemotePartial

public static class HtmlExtensions
{
    private const string _remotePartialsPath = "~/Views/_RemotePartialsCache/";
    private static readonly IDictionary<string, string> _remotePartialsMappingCache = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);

    public static MvcHtmlString RemotePartial(this HtmlHelper helper, string partialUrl, object model = null)
    {
        string cachedPath;

        // return cached copy if exists
        if (_remotePartialsMappingCache.TryGetValue(partialUrl, out cachedPath))
            return helper.Partial(_remotePartialsPath + cachedPath, model);

        // download remote data
        var webClient = new WebClient();
        var partialUri = new Uri(partialUrl);
        var partialData = webClient.DownloadString(partialUrl);

        // save cached copy locally
        var partialLocalName = Path.ChangeExtension(partialUri.LocalPath.Replace('/', '_'), "cshtml");
        var partialMappedPath = helper.ViewContext.RequestContext.HttpContext.Server.MapPath(_remotePartialsPath + partialLocalName);
        File.WriteAllText(partialMappedPath, partialData);

        // save to cache
        _remotePartialsMappingCache[partialUrl] = partialLocalName;

        return helper.Partial(_remotePartialsPath + partialLocalName, model);
    }
}

然后按如下方式使用:

@Html.RemotePartial("http://localhost/PartialServer/view/calculator.cshtml")

您还可以使用上述实现替换原始的Partial方法(只有在传递的路径是远程网址时才会起作用),但不建议这样做。