2014-10-27 5 views
3

У меня есть сервер, содержащий некоторые частичные файлы просмотра. Как я могу загрузить файлы в Html.Partial с другого сервера? как:Рендеринг частичных представлений, расположенных на удаленном сервере

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

Могу ли я отменить частичное, чтобы загрузить его из URL?

Asp.net MVC - это основа.

+0

Будет ли удаленный Url действительно возвращать полный код Razor? – haim770

+0

Нет, я настрою сервер репозитория для обслуживания этого типа файла. – mehr

+0

Я предполагаю, что ответ «да». Запрос Url действительно вернется к полному коду Razor ... – haim770

ответ

4

Сначала создайте новый каталог с именем _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); 

     // add to cache 
     _remotePartialsMappingCache.Add(partialUrl, partialLocalName); 

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

Затем использовать его следующим образом:

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

Вы также можете заменить оригинальный Partial метод с выше реализации (которые будут получать работу только когда пройденный путь является удаленным URL-адресом), но это не рекомендуется.

+2

+1 очень умное решение. Я бы также добавил способ сброса кеша. – MiBu

+2

@MiBu, спасибо. Я согласен, что должен быть способ управления кешем. Вероятно, нужна обработка исключений, я только хотел предоставить основные функции. – haim770

+0

спасибо haim770. отличный ответ – mehr

Смежные вопросы