EPiServer.Core.TypeMismatchException - PullRequest
       11

EPiServer.Core.TypeMismatchException

0 голосов
/ 04 октября 2018

Я новичок в разработке 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();
        }
    }
}

В чем проблема и как ее исправить?

1 Ответ

0 голосов
/ 04 октября 2018

По какой-то причине ваш контент BlockData обрабатывается представлением, которое требует, чтобы модель имела тип SitePageData.Другими словами, кажется, что вы визуализируете блок с просмотром страницы.

Но так как это не удается в режиме редактирования, возможно, вам просто не хватает средства предварительного просмотра для вашего типа блока, то есть вида, который управляеткак блок визуализируется сам в режиме редактирования на странице.

Работает ли предварительный просмотр блока для других типов блоков?

Подробности предварительного просмотра блока в режиме редактирования: https://world.episerver.com/documentation/developer-guides/CMS/rendering/preview-rendering-for-blocks/

...