Я новичок в разработке EPIServer, asp.net и C # и пытаюсь понять следующую проблему.
Я запустил экземпляр EPIServer CMS из Visual Studio.Я открыл ранее существующую тестовую страницу и добавил блок видеопроигрывателя (содержащий ссылку на YouTube) в область основного содержимого.Затем я опубликовал свою страницу и взглянул на нее во внешнем интерфейсе.
Затем я возвращаюсь, чтобы отредактировать страницу, нажимаю на блок видеопроигрывателя и выбираю «Правка», затем меня перенаправляют на страницу, гдеЯ могу отредактировать настройки этого блока видеопроигрывателя, но Visual Studio останавливается, и я получаю ошибку EPiServer.Core.TypeMismatchException в Visual Studio.
Сообщение об ошибке:
Возникло исключение: «EPiServer.Core.TypeMismatchException» в EPiServer.dll Исключение типа «EPiServer.Core.TypeMismatchException» произошло в EPiServer.dll, но не было обработано в пользовательском коде. Содержимое с идентификатором «9913_22802» имеет тип «Castle.Proxies.VideoPlayerBlock'который не наследует обязательный тип' Example.Site.Models.Pages.SitePageData '
Следующая строка кода помечена в Visual Studio как источник проблемы:
var currentPage = _contentLoader.Get<SitePageData>(currentContentLink);
Вот некоторый контекст:
public virtual LayoutModel CreateLayoutModel(ContentReference currentContentLink, RequestContext requestContext)
{
var startPageContentLink = SiteDefinition.Current.StartPage;
// Use the content link with version information when editing the startpage,
// otherwise the published version will be used when rendering the props below.
if (currentContentLink.CompareToIgnoreWorkID(startPageContentLink))
{
startPageContentLink = currentContentLink;
}
var startPage = _contentLoader.Get<StartPage>(startPageContentLink);
var currentPage = _contentLoader.Get<SitePageData>(currentContentLink);
var model = new LayoutModel
{
Logotype = startPage.SiteLogotype,
AlternativeLogotype = currentPage.AlternativeLogo.GetContent() as SiteLogotypeBlock,
GoogleTagManager = startPage.GoogleTagManager,
LogotypeLinkUrl = new MvcHtmlString(_urlResolver.GetUrl(SiteDefinition.Current.StartPage)),
AdditionalNavigationItems = startPage.AdditionalNavigationItems ?? new EPiServer.SpecializedProperties.LinkItemCollection(),
Footer = startPage.FooterBlock,
LoggedIn = requestContext.HttpContext.User.Identity.IsAuthenticated,
MarketPlaceUrl = startPage.MarketPlaceLink.GetContent() as GeneralLinkBlock,
LoginUrl = new MvcHtmlString(UrlResolver.Current.GetUrl(startPage.LoginPageLink)),
SearchActionUrl = new MvcHtmlString(UrlResolver.Current.GetUrl(startPage.SearchPageLink)),
IsInReadonlyMode = _databaseMode.DatabaseMode == DatabaseMode.ReadOnly
};
SetCountriesAndLanguages(GetLanguageVersions(currentContentLink, startPage), model);
var cookie = requestContext.HttpContext.Request.Cookies[Global.CookieNames.CookiesDisclaimerViewed];
if (cookie == null || cookie.Value.Equals(bool.FalseString))
{
SetCookieDisclaimer(model, startPage);
requestContext.HttpContext.Response.Cookies.Add(
new HttpCookie(Global.CookieNames.CookiesDisclaimerViewed, bool.TrueString)
{
Expires = DateTime.Now.AddYears(1)
});
}
return model;
}
Применимый контроллер:
namespace Example.Site.Controllers
{
public class VideoPlayerBlockController : BlockController<VideoPlayerBlock>
{
public override ActionResult Index(VideoPlayerBlock currentContent)
{
return PartialView(new VideoPlayerViewModel(currentContent));
}
}
}
Вид:
@model VideoPlayerViewModel
<section>
<div class="container">
<div class="row">
<div class="embed-responsive embed-responsive-16by9">
<iframe class="embed-responsive-item"
src=@Model.VideoURL
frameborder="0"
allow="autoplay; encrypted-media"
@Model.AllowFullScreen></iframe>
</div>
</div>
</div>
</section>
VideoPlayerViewModel.cs:
using Example.Site.Models.Blocks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
namespace Example.Site.Models.ViewModels
{
public class VideoPlayerViewModel
{
private const string YouTubeLink = "https://www.youtube.com/embed/";
private const string YouTubeNoCookieLink = "https://www.youtube-nocookie.com/embed/";
private const string StartAtParameter = "start=";
private const string ShowVideoSuggestionsParameter = "rel=0";
private const string PlayerControlsParameter = "controls=0";
private const string TitleAndPlayerActionsParameter = "showinfo=0";
private const string AllowFullscreenParameter = "allowfullscreen";
private const string DontAllowFullscreenParameter = "donotallowfullscreen";
//private const string VideoWidth = "width=";
//private const string VideoHeight = "height=";
public string VideoURL { get; set; }
public string AllowFullScreen { get; set; }
public VideoPlayerViewModel(VideoPlayerBlock videoBlock)
{
AllowFullScreen = videoBlock.AllowFullScreenMode ? AllowFullscreenParameter : DontAllowFullscreenParameter;
Uri uri = new UriBuilder(videoBlock.YouTubeLink).Uri;
var queryDictionary = HttpUtility.ParseQueryString(uri.Query);
var filmCode = queryDictionary.HasKeys() ? queryDictionary["v"] : uri.Segments[1];
StringBuilder builder = new StringBuilder(videoBlock.EnablePrivacyEnhancedMode ? YouTubeNoCookieLink : YouTubeLink).Append(filmCode);
var parameters = new List<string>();
if (!string.IsNullOrEmpty(videoBlock.StartAt) && !Regex.IsMatch(videoBlock.StartAt, "^[0]?[0][:][0]{2}$"))
{
var timeString = videoBlock.StartAt.Split(':');
if (Int32.TryParse(timeString[0], out var minutes) && (Int32.TryParse(timeString[1], out var seconds)))
{
parameters.Add(StartAtParameter + (minutes * 60 + seconds).ToString());
}
}
//if (videoBlock.CustomVideoWidth > 1 && videoBlock.CustomVideoWidth < 100)
//{
// parameters.Add(VideoWidth + videoBlock.CustomVideoWidth);
//}
if (!videoBlock.ShowVideosSuggestions)
{
parameters.Add(ShowVideoSuggestionsParameter);
}
if (!videoBlock.ShowPlayerControls)
{
parameters.Add(PlayerControlsParameter);
}
if (!videoBlock.ShowTitleAndPlayerActions)
{
parameters.Add(TitleAndPlayerActionsParameter);
}
if (parameters.Any())
{
builder.Append("?" + parameters[0]);
}
foreach (var parameter in parameters.Skip(1))
{
builder.Append("&" + parameter);
}
VideoURL = builder.ToString();
}
}
}
В чем проблема и как ее исправить?