Мы хотим разделить следующую логику среди наших представлений Орчард.Передайте произвольное значение (например, ширину изображения) с помощью 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 альтернативу?
Просто комментируя очевидное: '«Orchard.MediaLibrary.Models.MediaPart»не содержит определение для«Width'', кажется, указывает, что ваша модель не имеют свойство с именем 'Width' ... – silencedmessage
Это' dynamic'. Я обновлю пример, чтобы показать это. –
Справа ты ... Я не выглядел достаточно близко. Сожалею! – silencedmessage