The POC continues. As you may have noticed the solution I wrote about yesterday only worked sever side, no client side validation e.g.
This can be fixed as well. First I added another method to my util class, to get the fake ControllerContext and refactored it, so you won’t need the Dummy controller. I just use the FormContainerController: You will need that later.
public static ControllerContext GetFormControllerContext() { try { HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current); RouteData routeData = new RouteData(); routeData.Values.Add("controller", "FormContainerBlock"); routeData.Values.Add("action", "Index"); return new ControllerContext(new RequestContext(httpContextBase, routeData), new FormContainerBlockController()); } catch (ArgumentNullException argumentNullException) { Log.Critical("Cannot create controllercontext for the FormContainerBlock: \r\n {0}", argumentNullException); } return null; }
Next I added the method from the controller to register the resources to my UserControl, the complete code is in Gist:
public partial class FormContainerBlockControl : BlockControlBase<FormContainerBlock> { protected ContentArea FakeArea { get; private set; } protected ControllerContext FakeContext { get; private set; } protected void Page_Load(object sender, EventArgs e) { this.FakeContext = MvcUtility.GetFormControllerContext(); this.SetResources(this.FakeContext); // this.Page.Form.ID = this.CurrentBlock.Form.FormGuid.ToString(); if (!PageEditing.PageIsInEditMode) { GhostForm form = this.Page.Form as GhostForm; if (form != null) { form.RenderFormTag = false; } } ContentArea contentArea = new ContentArea(); contentArea.Items.Add(new ContentAreaItem { ContentLink = this.CurrentBlock.Content.ContentLink }); this.FakeArea = contentArea; this.DataBind(); } protected void Page_PreRender(object sender, EventArgs e) { this.SetVisitorIdentifierIfNeeded(this.FakeContext.HttpContext); } }
Still no luck though. Because you are using WebForms you have two forms, which confuses the module. So I somethingto hide the WebForms form when there is an EPiServer form on the page. I hope the Forms team will add an option to disable rendering the form tag. That way you can just set some attributes, instead of hiding it. So a custom control. You will need to replace the form control on your page with this custom one, thanks Jeremy
public class GhostForm : HtmlForm { protected bool render; public bool RenderFormTag { get { return this.render; } set { this.render = value; } } public GhostForm() { //By default, show the form tag this.render = true; } protected override void RenderBeginTag(HtmlTextWriter writer) { //Only render the tag when render is set to true if (this.render) { base.RenderBeginTag(writer); } } protected override void RenderEndTag(HtmlTextWriter writer) { //Only render the tag when render is set to true if (this.render) { base.RenderEndTag(writer); } } }
You see in the UserControl that I hide the WebForm when the control is on a page.
After this hack clientside validation was working, the default css was there. Yay. And the forms were submitted and the data could be retrieved.
This feels more hackish than what I did yesterday. So I’ll ask the forms team if they would be willing to make the rendering of the EPiServer Forms tag optional/disable it with a setting. That way you could do something like this in your masterpage:
<form runat="server" enctype="multipart/form-data" class="EPiServerForms " data-epiforms-type="form" ClientIDMode="Static">
And in the UserControl
this.Page.Form.ID = this.CurrentBlock.Form.FormGuid.ToString();
I will also ask them to make the setting of the resources that is done in the controller a separate method we can use.
So another step further and more testing to do.
All updated code en new code is on gist.
I have put all code on GitHub, you can also download a zip with the compiled dll and the views.
The POC continues in pt3
Hi, does this saves file upload submissions?
LikeLike
When I created it, it did. But remember… It is a “hack”, there are no guarantees it will keep working
LikeLike