Я использую Orchard 1.8 и создал новый тип контента (называемый PressRelease), запрашиваю результаты и проекцию для просмотра запроса с помощью пользовательского шаблона (с использованием альтернативных URL-адресов в формате List-ProjectionPage-url-PressRelease.cshtml
), и все это работает нормально.
Одна часть, которая ставит меня в тупик, заключается в том, что если я использую Theme Machine в качестве моей темы (нетронутой), это проекционное представление будет отображаться в неупорядоченном списке с соответствующими ссылками AutoRoute на отдельные объекты ContentItem, их метаданные и так далее. Я пытаюсь выяснить, как мне получить доступ к таким вещам, как URL-адрес AutoRoute для определенного элемента, метаданные (даты создания/публикации) и т. д. для использования с такими вещами, как кнопка «Поделиться в Facebook». По сути, я пытаюсь воссоздать это представление по умолчанию, хотя и с настройками.
Вот код для List-ProjectionPage-url-PressRelease.cshtml
:
@using Orchard.Utility.Extensions;
@using System.Linq
@functions
{
public class PressRelease
{
public PressRelease()
{
this.Attachments = new List<Attachment>();
}
public string Title { get; set; }
public string Source { get; set; }
public DateTime PublishDate { get; set; }
public string Body { get; set; }
public List<Attachment> Attachments { get; set; }
}
public class Attachment
{
public string Filename { get; set; }
public string Path { get; set; }
}
}
@{
//add list of dynamic objects to strongly typed class
var releases = new List<PressRelease>();
foreach (var item in @Model.Items)
{
var release = new PressRelease
{
Title = item.ContentItem.TitlePart.Title,
Source = item.ContentItem.PressRelease.Source.Value,
PublishDate = item.ContentItem.PressRelease.Date.DateTime,
Body = item.ContentItem.BodyPart.Text
};
//load attachment(s) to class
var attachments = (Orchard.MediaLibrary.Fields.MediaLibraryPickerField)item.ContentItem.PressRelease.Attachment;
if (attachments.MediaParts.Count() > 0)
{
foreach (var part in attachments.MediaParts)
{
release.Attachments.Add(new Attachment { Filename = part.FileName, Path = part.MediaUrl });
}
}
releases.Add(release);
}
}
@{
foreach (var item in releases)
{
<div class="press-release">
<div class="press-release-title">@item.Title</div>
<div class="press-release-meta">
<span class="press-release-source">Source: @item.Source</span>
@if (item.PublishDate != DateTime.MinValue)
{
<span class="press-release-date">@item.PublishDate.ToShortDateString()</span>
}
</div>
@if (item.Attachments.Count() > 0)
{
<div class="press-release-attachments">
<span class="press-release-attachments-title">Attached: </span>
@foreach (var attachment in item.Attachments)
{
var linkText = attachment.Filename;
var url = attachment.Path;
@Html.Link(linkText, url);
if (attachment != item.Attachments.Last())
{
<span>, </span>
}
}
</div>
}
<div class="press-release-body">
<p>@Html.Raw(item.Body.Replace("\r\n", "<br />"))</p>
</div>
</div>
<div class="social">
<!-- ** This is where I need AutoRoute URL so I can do FB share link **-->
<div class="fb-share-button" data-href="" data-type="button_count"></div>
</div>
if (item != releases.Last())
{
<hr />
}
}
}
Мысли?
ContentItem.AutoroutePart.Path
было именно то, что я искал. - person Scott Salyer   schedule 30.05.2014