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
@using EPiServer.Web.Mvc.Html
@model XXX.Models.ViewModels.XFormPageViewModel<div class="xformblock" @Html.EditAttributes(x => x.Schema)>
@Html.ValidationSummary()
@using (Html.BeginXForm(Model.Schema, new { Action = Model.ActionUri }))
{
Html.RenderXForm(Model.Schema);
}</div>
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