Update: Plugin Web Helpers

Web Helpers included in UI Extensions and WebHandlers
This commit is contained in:
Gary Sharp
2013-10-22 13:48:25 +11:00
parent cc218a08e4
commit 0d60fb422c
7 changed files with 166 additions and 130 deletions
+9 -96
View File
@@ -8,117 +8,30 @@ using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;
using System.Web.WebPages;
namespace Disco.Services.Plugins
{
public class WebHelper<T>
public class WebHelper
{
private WebViewPage<T> ViewPage { get; set; }
protected HttpContextBase Context { get; set; }
public PluginManifest Manifest { get; private set; }
public WebHelper(WebViewPage<T> ViewPage, PluginManifest manifest)
public WebHelper(HttpContextBase Context, PluginManifest Manifest)
{
this.ViewPage = ViewPage;
this.Manifest = manifest;
this.Context = Context;
this.Manifest = Manifest;
}
#region Html Helpers
#region Form Helpers
public MvcForm BeginForm(string Action, FormMethod Method, bool MultipartEncoding, IDictionary<string, object> HtmlAttributes)
{
if (string.IsNullOrEmpty(Action))
throw new ArgumentNullException("PluginAction");
var url = ActionUrl(Action);
return BeginForm_Helper(url.ToString(), Method, MultipartEncoding, HtmlAttributes);
}
public MvcForm BeginForm(string Action, FormMethod Method, bool MultipartEncoding)
{
return BeginForm(Action, Method, MultipartEncoding, null);
}
public MvcForm BeginForm(string Action, FormMethod Method, IDictionary<string, object> HtmlAttributes)
{
return BeginForm(Action, Method, false, HtmlAttributes);
}
public MvcForm BeginForm(string Action, FormMethod Method)
{
return BeginForm(Action, Method, false, null);
}
public MvcForm BeginForm(string Action)
{
return BeginForm(Action, FormMethod.Get, false, null);
}
private MvcForm BeginForm_Helper(string FormAction, FormMethod Method, bool MultipartEncoding, IDictionary<string, object> HtmlAttributes)
{
TagBuilder builder = new TagBuilder("form");
builder.MergeAttributes(HtmlAttributes);
if (MultipartEncoding)
builder.MergeAttribute("enctype", "multipart/form-data");
builder.MergeAttribute("action", FormAction);
builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(Method), true);
bool useClientValidation = ViewPage.ViewContext.ClientValidationEnabled && !ViewPage.ViewContext.UnobtrusiveJavaScriptEnabled;
if (useClientValidation)
{
object lastFormNumber = ViewPage.ViewContext.HttpContext.Items["DiscoPluginLastFormNum"];
int num = (lastFormNumber != null) ? (((int)lastFormNumber) + 1) : 1000;
ViewPage.ViewContext.HttpContext.Items["DiscoPluginLastFormNum"] = num;
builder.GenerateId(string.Format(CultureInfo.InvariantCulture, "form{0}", new object[] { num }));
}
ViewPage.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
MvcForm form = new MvcForm(ViewPage.ViewContext);
if (useClientValidation)
{
ViewPage.ViewContext.FormContext.FormId = builder.Attributes["id"];
}
return form;
}
#endregion
public void IncludeStyleSheet(string Resource)
{
ViewPage.Context.IncludeStyleSheetResource(Resource, this.Manifest);
Context.IncludeStyleSheetResource(Resource, this.Manifest);
}
public void IncludeJavaScript(string Resource)
{
ViewPage.Context.IncludeScriptResource(Resource, this.Manifest);
Context.IncludeScriptResource(Resource, this.Manifest);
}
public HtmlString PartialCompiled<ViewType>(object Model) where ViewType : WebViewPage
{
using (System.IO.StringWriter writer = new StringWriter(CultureInfo.CurrentCulture))
{
RenderPartialCompiled<ViewType>(writer, Model);
return new HtmlString(writer.ToString());
}
}
public HtmlString PartialCompiled<ViewType>() where ViewType : WebViewPage
{
return PartialCompiled<ViewType>(null);
}
private void RenderPartialCompiled<ViewType>(TextWriter Writer, object Model)
{
if (Writer == null)
throw new ArgumentNullException("Writer");
WebViewPage page = Activator.CreateInstance(typeof(ViewType)) as WebViewPage;
if (page == null)
throw new InvalidOperationException("Invalid View Type");
page.ViewContext = ViewPage.ViewContext;
page.ViewData = new ViewDataDictionary(Model);
page.InitHelpers();
HttpContextBase httpContext = ViewPage.ViewContext.HttpContext;
page.ExecutePageHierarchy(new WebPageContext(httpContext, null, Model), Writer, null);
}
#endregion
#region Urls
public HtmlString ConfigurationUrl()
@@ -130,7 +43,7 @@ namespace Disco.Services.Plugins
public HtmlString ActionUrl(string Action)
{
var url = GenerateUrl("Plugin", new Dictionary<string, object>() { { "PluginId", Manifest.Id }, { "PluginAction", Action } });
var url = Manifest.WebActionUrl(Action);
return new HtmlString(url);
}
@@ -155,7 +68,7 @@ namespace Disco.Services.Plugins
#region Helpers
private string GenerateUrl(string RouteName, RouteValueDictionary RouteValues)
{
return UrlHelper.GenerateUrl(RouteName, null, null, RouteValues, RouteTable.Routes, ViewPage.Request.RequestContext, false);
return UrlHelper.GenerateUrl(RouteName, null, null, RouteValues, RouteTable.Routes, Context.Request.RequestContext, false);
}
private string GenerateUrl(string RouteName, IDictionary<string, object> RouteValues)
{