Got .Field method for MVC working and have macro's rendering inside of RTE in MVC.
Added internal setting for global settings to return an MVC area string based on the umbraco path. Added a ton of extension methods from v5 that are used in much of the MVC engines. Added UmbracoHelper methods for MVC rendering including Field so that we can render the correct RTE field markup when the RTE contains a macro, will add extension methods for the @CurrentPage dynamic object to do the same to make it consistent.
This commit is contained in:
312
src/Umbraco.Web/HtmlHelperRenderExtensions.cs
Normal file
312
src/Umbraco.Web/HtmlHelperRenderExtensions.cs
Normal file
@@ -0,0 +1,312 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Mvc.Html;
|
||||
using Umbraco.Core;
|
||||
using umbraco;
|
||||
|
||||
namespace Umbraco.Web
|
||||
{
|
||||
/// <summary>
|
||||
/// HtmlHelper extensions for use in templates
|
||||
/// </summary>
|
||||
public static class HtmlHelperRenderExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Used for rendering out the Form for BeginUmbracoForm
|
||||
/// </summary>
|
||||
internal class UmbracoForm : MvcForm
|
||||
{
|
||||
public UmbracoForm(
|
||||
ViewContext viewContext,
|
||||
string surfaceController,
|
||||
string surfaceAction,
|
||||
string area,
|
||||
Guid? surfaceId,
|
||||
object additionalRouteVals = null)
|
||||
: base(viewContext)
|
||||
{
|
||||
//need to create a params string as Base64 to put into our hidden field to use during the routes
|
||||
string surfaceRouteParams;
|
||||
if (surfaceId.HasValue)
|
||||
{
|
||||
surfaceRouteParams = string.Format("c={0}&a={1}&i={2}&ar={3}",
|
||||
viewContext.HttpContext.Server.UrlEncode(surfaceController),
|
||||
viewContext.HttpContext.Server.UrlEncode(surfaceAction),
|
||||
viewContext.HttpContext.Server.UrlEncode(surfaceId.Value.ToString("N")),
|
||||
area);
|
||||
}
|
||||
else
|
||||
{
|
||||
surfaceRouteParams = string.Format("c={0}&a={1}&ar={2}",
|
||||
viewContext.HttpContext.Server.UrlEncode(surfaceController),
|
||||
viewContext.HttpContext.Server.UrlEncode(surfaceAction),
|
||||
area);
|
||||
}
|
||||
|
||||
var additionalRouteValsAsQuery = additionalRouteVals.ToDictionary<object>().ToQueryString();
|
||||
if (!additionalRouteValsAsQuery.IsNullOrWhiteSpace())
|
||||
surfaceRouteParams = "&" + additionalRouteValsAsQuery;
|
||||
|
||||
_base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(surfaceRouteParams));
|
||||
|
||||
_textWriter = viewContext.Writer;
|
||||
}
|
||||
|
||||
|
||||
private bool _disposed;
|
||||
private readonly string _base64String;
|
||||
private readonly TextWriter _textWriter;
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (this._disposed)
|
||||
return;
|
||||
this._disposed = true;
|
||||
|
||||
//write out the hidden surface form routes
|
||||
_textWriter.Write("<input name='uformpostroutevals' type='hidden' value='" + _base64String + "' />");
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
|
||||
public static MvcHtmlString EditorFor<T>(this HtmlHelper htmlHelper, string templateName = "", string htmlFieldName = "", object additionalViewData = null)
|
||||
where T : new()
|
||||
{
|
||||
var model = new T();
|
||||
var typedHelper = new HtmlHelper<T>(
|
||||
htmlHelper.ViewContext.CopyWithModel(model),
|
||||
htmlHelper.ViewDataContainer.CopyWithModel(model));
|
||||
|
||||
return typedHelper.EditorFor(x => model, templateName, htmlFieldName, additionalViewData);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A validation summary that lets you pass in a prefix so that the summary only displays for elements
|
||||
/// containing the prefix. This allows you to have more than on validation summary on a page.
|
||||
/// </summary>
|
||||
/// <param name="htmlHelper"></param>
|
||||
/// <param name="prefix"></param>
|
||||
/// <param name="excludePropertyErrors"></param>
|
||||
/// <param name="message"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper,
|
||||
string prefix = "",
|
||||
bool excludePropertyErrors = false,
|
||||
string message = "",
|
||||
IDictionary<string, object> htmlAttributes = null)
|
||||
{
|
||||
if (prefix.IsNullOrWhiteSpace())
|
||||
{
|
||||
return htmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes);
|
||||
}
|
||||
|
||||
//if there's a prefix applied, we need to create a new html helper with a filtered ModelState collection so that it only looks for
|
||||
//specific model state with the prefix.
|
||||
var filteredHtmlHelper = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer.FilterContainer(prefix));
|
||||
return filteredHtmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline against a locally declared controller
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="controllerName"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, string controllerName)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, controllerName, null, new Dictionary<string, object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline against a locally declared controller
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="controllerName"></param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, string controllerName,
|
||||
object additionalRouteVals)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, controllerName, additionalRouteVals, new Dictionary<string, object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline against a locally declared controller
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="controllerName"></param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, string controllerName,
|
||||
object additionalRouteVals,
|
||||
object htmlAttributes)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, controllerName, additionalRouteVals, htmlAttributes.ToDictionary<object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline against a locally declared controller
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="controllerName"></param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, string controllerName,
|
||||
object additionalRouteVals,
|
||||
IDictionary<string, object> htmlAttributes)
|
||||
{
|
||||
var settings = DependencyResolver.Current.GetService<UmbracoSettings>();
|
||||
var area = Umbraco.Core.Configuration.GlobalSettings.MvcArea;
|
||||
var formAction = html.ViewContext.HttpContext.Request.Url.AbsolutePath;
|
||||
|
||||
return html.RenderForm(formAction, FormMethod.Post, htmlAttributes, controllerName, action, area, null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline to a surface controller plugin
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="surfaceId">The surface controller to route to</param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, Guid surfaceId)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, surfaceId, null, new Dictionary<string, object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline to a surface controller plugin
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="surfaceId">The surface controller to route to</param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, Guid surfaceId,
|
||||
object additionalRouteVals)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, surfaceId, additionalRouteVals, new Dictionary<string, object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline to a surface controller plugin
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="surfaceId">The surface controller to route to</param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, Guid surfaceId,
|
||||
object additionalRouteVals,
|
||||
object htmlAttributes)
|
||||
{
|
||||
return html.BeginUmbracoForm(action, surfaceId, additionalRouteVals, htmlAttributes.ToDictionary<object>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to create a new form to execute in the Umbraco request pipeline to a surface controller plugin
|
||||
/// </summary>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="surfaceId">The surface controller to route to</param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <returns></returns>
|
||||
public static MvcForm BeginUmbracoForm(this HtmlHelper html, string action, Guid surfaceId,
|
||||
object additionalRouteVals,
|
||||
IDictionary<string, object> htmlAttributes)
|
||||
{
|
||||
//TODO: Make me work :)
|
||||
|
||||
throw new NotImplementedException();
|
||||
|
||||
//var settings = DependencyResolver.Current.GetService<UmbracoSettings>();
|
||||
//var area = Umbraco.Core.Configuration.GlobalSettings.MvcArea;
|
||||
//var formAction = html.ViewContext.HttpContext.Request.Url.AbsolutePath;
|
||||
|
||||
//var surfaceMetadata = DependencyResolver.Current.GetService<ComponentRegistrations>()
|
||||
// .SurfaceControllers
|
||||
// .Where(x => x.Metadata.Id == surfaceId)
|
||||
// .SingleOrDefault();
|
||||
//if (surfaceMetadata == null)
|
||||
// throw new InvalidOperationException("Could not find the surface controller with id " + surfaceId);
|
||||
////now, need to figure out what area this surface controller belongs too...
|
||||
//var pluginDefition = surfaceMetadata.Metadata.PluginDefinition;
|
||||
//if (pluginDefition.HasRoutablePackageArea())
|
||||
//{
|
||||
// //a plugin def CAN be null, if the plugin is actually in our Web DLL folder or if someone drops their
|
||||
// //dll into the bin... though if they do that it still wont work since they wont get an area registered.
|
||||
// //area = PluginManager.GetPackageFolderFromPluginDll(pluginDefition.OriginalAssemblyFile).Name;
|
||||
// area = pluginDefition.PackageName;
|
||||
//}
|
||||
|
||||
////render the form
|
||||
//return html.RenderForm(formAction, FormMethod.Post, htmlAttributes, surfaceMetadata.Metadata.ControllerName, action, area, surfaceId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This renders out the form for us
|
||||
/// </summary>
|
||||
/// <param name="htmlHelper"></param>
|
||||
/// <param name="formAction"></param>
|
||||
/// <param name="method"></param>
|
||||
/// <param name="htmlAttributes"></param>
|
||||
/// <param name="surfaceController"></param>
|
||||
/// <param name="surfaceAction"></param>
|
||||
/// <param name="area"></param>
|
||||
/// <param name="surfaceId"></param>
|
||||
/// <param name="additionalRouteVals"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This code is pretty much the same as the underlying MVC code that writes out the form
|
||||
/// </remarks>
|
||||
private static MvcForm RenderForm(this HtmlHelper htmlHelper,
|
||||
string formAction,
|
||||
FormMethod method,
|
||||
IDictionary<string, object> htmlAttributes,
|
||||
string surfaceController,
|
||||
string surfaceAction,
|
||||
string area,
|
||||
Guid? surfaceId,
|
||||
object additionalRouteVals = null)
|
||||
{
|
||||
|
||||
var tagBuilder = new TagBuilder("form");
|
||||
tagBuilder.MergeAttributes(htmlAttributes);
|
||||
// action is implicitly generated, so htmlAttributes take precedence.
|
||||
tagBuilder.MergeAttribute("action", formAction);
|
||||
// method is an explicit parameter, so it takes precedence over the htmlAttributes.
|
||||
tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
|
||||
var traditionalJavascriptEnabled = htmlHelper.ViewContext.ClientValidationEnabled && !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;
|
||||
if (traditionalJavascriptEnabled)
|
||||
{
|
||||
// forms must have an ID for client validation
|
||||
tagBuilder.GenerateId("form" + Guid.NewGuid().ToString("N"));
|
||||
}
|
||||
htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
|
||||
|
||||
//new UmbracoForm:
|
||||
var theForm = new UmbracoForm(htmlHelper.ViewContext, surfaceController, surfaceAction, area, surfaceId, additionalRouteVals);
|
||||
|
||||
if (traditionalJavascriptEnabled)
|
||||
{
|
||||
htmlHelper.ViewContext.FormContext.FormId = tagBuilder.Attributes["id"];
|
||||
}
|
||||
return theForm;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user