Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
AI OnAI Off
Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more
Hi Jon,
With a content block template, if you use default block controller then you only need to create a partial view template with name convension {BlockTypeName}.cshtml and the view model type must be that block type. If you create your own controller then you need to point to correct partial view template. In your example, there are 2 ways to fix your problem:
1. Change this line
return this.PartialView(viewModel);
to
return this.PartialView("XFormBlock",viewModel);
2. Change view name and create parent folder as default MVC like: Views/XFormBlock/Index.cshtml
The Error is:
The model item passed into the dictionary is of type 'Castle.Proxies.XFormBlockProxy', but this dictionary requires a model item of type 'XXX.Models.ViewModels.XFormPageViewModel'.
at System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value)
at System.Web.Mvc.ViewDataDictionary.set_Model(Object value)
at System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary)
at System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData)
at System.Web.Mvc.WebViewPage.set_ViewData(ViewDataDictionary value)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at EPiServer.Web.Mvc.ViewExtensions.Render[T](IView view, ViewEngineResult viewEngineResult, ViewContext context, TextWriter writer, T data)
at EPiServer.Web.Mvc.MvcContentRenderer.HandleRenderTemplateWithViewEngine(HtmlHelper helper, IContentData contentData, TemplateModel templateModel)
at EPiServer.Web.Mvc.MvcContentRenderer.Render(HtmlHelper helper, PartialRequest partialRequestHandler, IContentData contentData, TemplateModel templateModel)
at XXX.Business.Rendering.ErrorHandlingContentRenderer.Render(HtmlHelper helper, PartialRequest partialRequestHandler, IContentData contentData, TemplateModel templateModel)
Here is my code:
XFormBlock.cshtml
XFormBlock.cs
using System.ComponentModel.DataAnnotations; using EPiServer.Core; using EPiServer.DataAbstraction; using EPiServer.DataAnnotations; using EPiServer.XForms; namespace GoConstruct.Models.Blocks { [SiteContentType(GUID = "E6CE8FD6-DCA9-454C-B219-2C4D0DB9E17D", GroupName = Global.GroupNames.Phase1point5, DisplayName = "1.5 X-Form Block", Description = "Add a form to the site", Order = 37)] [SiteImageUrl("/Static/Gfx/blocks/form.jpg")] public class XFormBlock : SiteBlockData { [Display( GroupName = SystemTabNames.Content, Order = 1)] [CultureSpecific] public virtual string Heading { get; set; } [Display( GroupName = SystemTabNames.Content, Order = 2)] [CultureSpecific] public virtual XForm Schema { get; set; } } }
XFormBlockController.cs
public class XFormBlockController : BaseBlockController<XFormBlock> { // GET: XFormBlock public override ActionResult Index(XFormBlock currentBlock) { var id = (currentBlock as IContent).ContentLink.ID; // ViewData is not automatically passed to a block controller, need to get it from TempData if it exists var viewDataKey = string.Format("TempViewData_{0}", id); if (this.TempData[viewDataKey] != null) { this.ViewData = (ViewDataDictionary)this.TempData[viewDataKey]; } // Create the viewmodel var viewModel = new XFormPageViewModel(currentBlock, EpiServerDependencies) { Schema = currentBlock.Schema, Heading = currentBlock.Heading }; var pageRouteHelper = ServiceLocator.Current.GetInstance<PageRouteHelper>(); PageData currentPage = pageRouteHelper.Page; // Create postback url if (viewModel.Schema != null && currentPage != null) { var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>(); var pageUrl = urlResolver.GetVirtualPath(currentPage.ContentLink); var actionUrl = string.Format("{0}XFormPost/", pageUrl); actionUrl = UriSupport.AddQueryString(actionUrl, "XFormId", viewModel.Schema.Id.ToString()); actionUrl = UriSupport.AddQueryString(actionUrl, "failedAction", "Failed"); actionUrl = UriSupport.AddQueryString(actionUrl, "successAction", "Success"); actionUrl = UriSupport.AddQueryString(actionUrl, "contentId", id.ToString()); viewModel.ActionUri = actionUrl; } var editHints = this.ViewData.GetEditHints<XFormPageViewModel, XFormBlock>(); editHints.AddConnection(v => v.Schema, p => p.Schema); return this.PartialView(viewModel); } }
XFormPageViewModel.cs
using EPiServer.XForms; using XXX.Models.Blocks; using XXX.Models.ViewModels.Base; using JonDJones.Com.Core; public class XFormPageViewModel : BlockViewModel<XFormBlock> { public XFormPageViewModel(XFormBlock currentBlock, IEpiServerDependencies epiServerDependencies) : base(currentBlock, epiServerDependencies) { } public XForm Schema { get; set; } public string ActionUri { get; set; } public string Heading { get; set; } }
Can you let me know if you can see where I am going wrong?
Many thanks
Jon