2014-08-22 2 views
0

Мы хотим разделить следующую логику среди наших представлений Орчард.Передайте произвольное значение (например, ширину изображения) с помощью BuildDisplay альтернативному

@helper CreateImgFromMediaPart(dynamic mediaPart, int width = 150) 
{ 
    var imgSrc = mediaPart != null ? mediaPart.MediaUrl : string.Empty; 
    var imgAlt = mediaPart != null ? mediaPart.AlternateText : string.Empty; 
    <img alt="@imgAlt" src="@imgSrc" /> 
} 

К этой цели мы создали альтернативный под названием Media-Image.SizedThumbnail.cshtml, который визуализирует Media_Image форму.

Медиа-Image.SizedThumbnail.cshtml - создать общий альтернативный

@using Orchard.ContentManagement 
@using Orchard.MediaLibrary.Models 
@using Orchard.Utility.Extensions 
@model dynamic 

    @{ 
     ContentItem contentItem = Model.ContentItem; 
     var media = contentItem.As<MediaPart>(); 
     var image = contentItem.As<ImagePart>(); 
     var width = media.Width != null ? media.Width : 200; // get the width 
    } 

    <div> 
     <img src="@Display.ResizeMediaUrl(
         Width: width, 
         Mode: "max", 
         Alignment: "middlecenter", 
         Path: media.MediaUrl)" /> 
    </div> 

Мы можем успешно назвать которые чередуются с Display(BuildDisplay(mediaPart, "ResizeThumbnail)). Это почти работает. Задача состоит в том, чтобы передать Width, что мы хотим, чтобы изображение стало.

MyView.cshtml - Попробуйте передать ширину.

// Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
// 'Orchard.MediaLibrary.Models.MediaPart' does not contain a definition for 'Width' 
// This is odd to me, because mediaPart is dynamic 
mediaPart.Width = 200; 
@Display(BuildDisplay(mediaPart, "SizedThumbnail") 

// Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
// The best overloaded method match for 
// BuildDisplay(Orchard.ContentManagement.IContent, string, string)' 
// has some invalid arguments 
var mediaPartExpando = MyFunctions.ToDynamic(mediaPart); 
mediaPartExpando.Width = 200; 
@Display(BuildDisplay(mediaPartExpando, "SizedThumbnail") 

// System.NullReferenceException: Object reference not set to an instance of an object. 
var mediaPartExpando = MyFunctions.ToDynamic(mediaPart); 
mediaPartExpando.Width = 200; 
var mediaPartAgain = mediaPartExpando as IContent; 
@Display(BuildDisplay(mediaPartAgain, "SizedThumbnail") 

Я, очевидно, сражаюсь с компиляцией и временем выполнения. Как мы можем передать ширину через BuildDisplay альтернативу?

+0

Просто комментируя очевидное: '«Orchard.MediaLibrary.Models.MediaPart»не содержит определение для«Width'', кажется, указывает, что ваша модель не имеют свойство с именем 'Width' ... – silencedmessage

+0

Это' dynamic'. Я обновлю пример, чтобы показать это. –

+0

Справа ты ... Я не выглядел достаточно близко. Сожалею! – silencedmessage

ответ

1

Во-первых, это не здорово, что вы могли бы назвать BuildDisplay с точки зрения. Было бы лучше, если это возможно, если драйвер или контроллер, ответственный за создание этого MyView.cshtml, сделал это.

Во-вторых, то, что возвращает BuildDisplay, представляет собой форму, к которой вы можете добавлять свойства динамически. Таким образом, вы должны быть в состоянии сделать это:

@Display(BuildDisplay(mediaPart, "SizedThumbnail").Width(200)) 
+0

В сценарии вопросов невозможно изменить драйвер, поскольку представление находится в теме, и потому что представление предназначено для макета формы запроса. В этом случае вызов BuildDisplay кажется разумным вариантом? –

+1

Ну, проблема в том, что BuildDisplay потенциально будет запрашивать базу данных и вызывать проблемы. Его следует избегать с точки зрения, это просто нечисто. Однако не всегда легко сделать это. Часто упускается из виду возможность иметь более одного драйвера для той же части или манипулировать фигурой из поставщика таблицы форм. –

+0

Хорошо знать, как стрелять в ногу с помощью «BuildDisplay» в те времена, когда эта жертва - единственный вариант. Например, модуль Orchard.MediaLibrary использует «BuildDisplay» в виде пять раз. –

0

ViewBag будет делать, пока мы не найдем лучший ответ:

MyView.cshtml - Попробуйте пройти ширину.

ViewBag.ResizedThumbnailWidth = 200; 
@Display(BuildDisplay(mediaPart, "SizedThumbnail")) 

Медиа-Image.SizedThumbnail.cshtml - Общий альтернативный

@using Orchard.ContentManagement 
@using Orchard.MediaLibrary.Models 
@using Orchard.Utility.Extensions 
@model dynamic 

    @{ 
     ContentItem contentItem = Model.ContentItem; 
     var media = contentItem.As<MediaPart>(); 
     var image = contentItem.As<ImagePart>(); 
     var width = ViewBag.ResizedThumbnailWidth ?? 200; 
    } 

    <div> 
     <img src="@Display.ResizeMediaUrl(
         Width: width, 
         Mode: "max", 
         Alignment: "middlecenter", 
         Path: media.MediaUrl)" /> 
    </div> 

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

  • Нет связанных вопросов^_^