Update: Use Generics for Compiled View

Also standardize inclusion of StyleSheets/Scripts for Plugin Resources
This commit is contained in:
Gary Sharp
2013-10-21 20:05:33 +11:00
parent 4dfe9ad086
commit 401ae029f1
10 changed files with 92 additions and 36 deletions
@@ -13,18 +13,18 @@ namespace Disco.Services.Plugins.Features.UIExtension.Results
public class PluginResourceCssResult : UIExtensionResult public class PluginResourceCssResult : UIExtensionResult
{ {
private string _resource; private string _resource;
private HtmlString _resourceUrl; private string _resourceUrl;
public PluginResourceCssResult(PluginFeatureManifest Source, string Resource) public PluginResourceCssResult(PluginFeatureManifest Source, string Resource)
: base(Source) : base(Source)
{ {
this._resource = Resource; this._resource = Resource;
this._resourceUrl = new HtmlString(Source.PluginManifest.WebResourceUrl(Resource)); this._resourceUrl = Source.PluginManifest.WebResourceUrl(Resource);
var deferredBundles = HttpContext.Current.Items[Bundle.UIExtensionCssKey] as List<HtmlString>; var deferredBundles = HttpContext.Current.Items[Bundle.UIExtensionCssKey] as List<string>;
if (deferredBundles == null) if (deferredBundles == null)
{ {
deferredBundles = new List<HtmlString>(); deferredBundles = new List<string>();
HttpContext.Current.Items[Bundle.UIExtensionCssKey] = deferredBundles; HttpContext.Current.Items[Bundle.UIExtensionCssKey] = deferredBundles;
} }
if (!deferredBundles.Contains(this._resourceUrl)) if (!deferredBundles.Contains(this._resourceUrl))
@@ -11,22 +11,22 @@ namespace Disco.Services.Plugins.Features.UIExtension.Results
public class PluginResourceScriptResult : UIExtensionResult public class PluginResourceScriptResult : UIExtensionResult
{ {
private string _resource; private string _resource;
private HtmlString _resourceUrl; private string _resourceUrl;
private bool _placeInPageHead; private bool _placeInPageHead;
public PluginResourceScriptResult(PluginFeatureManifest Source, string Resource, bool PlaceInPageHead) public PluginResourceScriptResult(PluginFeatureManifest Source, string Resource, bool PlaceInPageHead)
: base(Source) : base(Source)
{ {
this._resource = Resource; this._resource = Resource;
this._resourceUrl = new HtmlString(Source.PluginManifest.WebResourceUrl(Resource)); this._resourceUrl = Source.PluginManifest.WebResourceUrl(Resource);
this._placeInPageHead = PlaceInPageHead; this._placeInPageHead = PlaceInPageHead;
if (this._placeInPageHead) if (this._placeInPageHead)
{ {
var deferredBundles = HttpContext.Current.Items[Bundle.UIExtensionScriptsKey] as List<HtmlString>; var deferredBundles = HttpContext.Current.Items[Bundle.UIExtensionScriptsKey] as List<string>;
if (deferredBundles == null) if (deferredBundles == null)
{ {
deferredBundles = new List<HtmlString>(); deferredBundles = new List<string>();
HttpContext.Current.Items[Bundle.UIExtensionScriptsKey] = deferredBundles; HttpContext.Current.Items[Bundle.UIExtensionScriptsKey] = deferredBundles;
} }
if (!deferredBundles.Contains(this._resourceUrl)) if (!deferredBundles.Contains(this._resourceUrl))
@@ -12,8 +12,27 @@ namespace Disco.Services.Plugins.Features.UIExtension
[PluginFeatureCategory(DisplayName = "User Interface Extensions")] [PluginFeatureCategory(DisplayName = "User Interface Extensions")]
public abstract class UIExtensionFeature<UIModel> : PluginFeature where UIModel : BaseUIModel public abstract class UIExtensionFeature<UIModel> : PluginFeature where UIModel : BaseUIModel
{ {
public ControllerContext Context { get; set; }
public abstract UIExtensionResult ExecuteAction(ControllerContext context, UIModel model); public abstract UIExtensionResult ExecuteAction(ControllerContext context, UIModel model);
#region Bundles
public void IncludeStyleSheet(string Resource)
{
if (this.Context == null)
throw new NullReferenceException("This method can only be called when a Context is available");
this.Context.HttpContext.IncludeStyleSheetResource(Resource, this.Manifest.PluginManifest);
}
public void IncludeScript(string Resource)
{
if (this.Context == null)
throw new NullReferenceException("This method can only be called when a Context is available");
this.Context.HttpContext.IncludeScriptResource(Resource, this.Manifest.PluginManifest);
}
#endregion
#region ActionResults #region ActionResults
protected LiteralResult Literal(string Content) protected LiteralResult Literal(string Content)
@@ -40,10 +59,15 @@ namespace Disco.Services.Plugins.Features.UIExtension
{ {
return new MultipleResult(this.Manifest, Results); return new MultipleResult(this.Manifest, Results);
} }
[Obsolete("Use: PartialCompiled<ViewType>(dynamic Model)")]
protected PrecompiledPartialViewResult Partial(Type PartialViewType, object Model = null) protected PrecompiledPartialViewResult Partial(Type PartialViewType, object Model = null)
{ {
return new PrecompiledPartialViewResult(this.Manifest, PartialViewType, Model); return new PrecompiledPartialViewResult(this.Manifest, PartialViewType, Model);
} }
protected PrecompiledPartialViewResult PartialCompiled<ViewType>(dynamic Model = null) where ViewType : WebViewPage
{
return new PrecompiledPartialViewResult(this.Manifest, typeof(ViewType), Model);
}
#endregion #endregion
@@ -46,6 +46,7 @@ namespace Disco.Services.Plugins.Features.UIExtension
{ {
using (var uiExtInstance = uiExt.CreateInstance<UIExtensionFeature<UIModel>>()) using (var uiExtInstance = uiExt.CreateInstance<UIExtensionFeature<UIModel>>())
{ {
uiExtInstance.Context = context;
uiExtResults.Enqueue(uiExtInstance.ExecuteAction(context, model)); uiExtResults.Enqueue(uiExtInstance.ExecuteAction(context, model));
} }
} }
@@ -20,17 +20,24 @@ namespace Disco.Services.Plugins
// Nothing in Base Class // Nothing in Base Class
} }
[Obsolete("Use: Response<ViewType>(dynamic ViewModel)")]
protected PluginConfigurationHandlerGetResponse GetResponse(Type ViewType, dynamic ViewModel = null) protected PluginConfigurationHandlerGetResponse GetResponse(Type ViewType, dynamic ViewModel = null)
{ {
return new PluginConfigurationHandlerGetResponse(this.Manifest, ViewType, ViewModel); return new PluginConfigurationHandlerGetResponse(this.Manifest, ViewType, ViewModel);
} }
protected PluginConfigurationHandlerGetResponse Response<ViewType>(dynamic Model = null) where ViewType : WebViewPage
{
return new PluginConfigurationHandlerGetResponse(this.Manifest, typeof(ViewType), Model);
}
public class PluginConfigurationHandlerGetResponse public class PluginConfigurationHandlerGetResponse
{ {
public PluginManifest Manifest { get; set; } public PluginManifest Manifest { get; set; }
public Type ViewType { get; set; } public Type ViewType { get; set; }
public dynamic ViewModel { get; set; } public dynamic Model { get; set; }
public PluginConfigurationHandlerGetResponse(PluginManifest Manifest, Type ViewType, dynamic ViewModel = null) public PluginConfigurationHandlerGetResponse(PluginManifest Manifest, Type ViewType, dynamic Model = null)
{ {
if (ViewType == null) if (ViewType == null)
throw new ArgumentNullException("ViewType"); throw new ArgumentNullException("ViewType");
@@ -40,7 +47,7 @@ namespace Disco.Services.Plugins
this.Manifest = Manifest; this.Manifest = Manifest;
this.ViewType = ViewType; this.ViewType = ViewType;
this.ViewModel = ViewModel; this.Model = Model;
} }
} }
} }
@@ -93,6 +93,35 @@ namespace Disco.Services.Plugins
} }
#endregion #endregion
#region Bundling
public static void IncludeStyleSheetResource(this HttpContextBase Context, string Resource, PluginManifest manifest)
{
var resourceUrl = manifest.WebResourceUrl(Resource);
var deferredBundles = Context.Items[Bundle.UIExtensionCssKey] as List<string>;
if (deferredBundles == null)
{
deferredBundles = new List<string>();
HttpContext.Current.Items[Bundle.UIExtensionCssKey] = deferredBundles;
}
if (!deferredBundles.Contains(resourceUrl))
deferredBundles.Add(resourceUrl);
}
public static void IncludeScriptResource(this HttpContextBase Context, string Resource, PluginManifest manifest)
{
var resourcePath = manifest.WebResourceUrl(Resource);
var deferredBundles = Context.Items[Bundle.UIExtensionScriptsKey] as List<string>;
if (deferredBundles == null)
{
deferredBundles = new List<string>();
HttpContext.Current.Items[Bundle.UIExtensionScriptsKey] = deferredBundles;
}
if (!deferredBundles.Contains(resourcePath))
deferredBundles.Add(resourcePath);
}
#endregion
#region Virtual Directories #region Virtual Directories
[Obsolete("Inherit ViewPages from 'Disco.Services.Plugins.WebViewPage' instead.")] [Obsolete("Inherit ViewPages from 'Disco.Services.Plugins.WebViewPage' instead.")]
@@ -70,6 +70,19 @@ namespace Disco.Services.Plugins
#endregion #endregion
#region Bundles
public void IncludeStyleSheet(string Resource)
{
this.HostController.HttpContext.IncludeStyleSheetResource(Resource, this.Manifest);
}
public void IncludeScript(string Resource)
{
this.HostController.HttpContext.IncludeScriptResource(Resource, this.Manifest);
}
#endregion
#region Action Results #region Action Results
#region Compiled View #region Compiled View
+2 -20
View File
@@ -83,29 +83,11 @@ namespace Disco.Services.Plugins
public void IncludeStyleSheet(string Resource) public void IncludeStyleSheet(string Resource)
{ {
var url = ResourceUrl(Resource); ViewPage.Context.IncludeStyleSheetResource(Resource, this.Manifest);
var deferredBundles = ViewPage.Context.Items[Bundle.UIExtensionCssKey] as List<HtmlString>;
if (deferredBundles == null)
{
deferredBundles = new List<HtmlString>();
ViewPage.Context.Items[Bundle.UIExtensionCssKey] = deferredBundles;
}
if (!deferredBundles.Contains(url))
deferredBundles.Add(url);
} }
public void IncludeJavaScript(string Resource) public void IncludeJavaScript(string Resource)
{ {
var url = ResourceUrl(Resource); ViewPage.Context.IncludeScriptResource(Resource, this.Manifest);
var deferredBundles = ViewPage.Context.Items[Bundle.UIExtensionScriptsKey] as List<HtmlString>;
if (deferredBundles == null)
{
deferredBundles = new List<HtmlString>();
ViewPage.Context.Items[Bundle.UIExtensionScriptsKey] = deferredBundles;
}
if (!deferredBundles.Contains(url))
deferredBundles.Add(url);
} }
public HtmlString PartialCompiled<ViewType>(object Model) where ViewType : WebViewPage public HtmlString PartialCompiled<ViewType>(object Model) where ViewType : WebViewPage
@@ -29,8 +29,8 @@ namespace Disco.Services.Web
{ {
var deferredBundles = htmlHelper.ViewContext.HttpContext.Items[Bundle.DeferredKey] as List<string>; var deferredBundles = htmlHelper.ViewContext.HttpContext.Items[Bundle.DeferredKey] as List<string>;
var uiExtensionScripts = htmlHelper.ViewContext.HttpContext.Items[Bundle.UIExtensionScriptsKey] as List<HtmlString>; var uiExtensionScripts = htmlHelper.ViewContext.HttpContext.Items[Bundle.UIExtensionScriptsKey] as List<string>;
var uiExtensionCss = htmlHelper.ViewContext.HttpContext.Items[Bundle.UIExtensionCssKey] as List<HtmlString>; var uiExtensionCss = htmlHelper.ViewContext.HttpContext.Items[Bundle.UIExtensionCssKey] as List<string>;
if (deferredBundles != null || uiExtensionScripts != null || uiExtensionCss != null) if (deferredBundles != null || uiExtensionScripts != null || uiExtensionCss != null)
{ {
@@ -46,12 +46,12 @@ namespace Disco.Services.Web
} }
if (uiExtensionCss != null) if (uiExtensionCss != null)
{ {
foreach (HtmlString extensionUrl in uiExtensionCss) foreach (string extensionUrl in uiExtensionCss)
bundleUrls.Append("<link href=\"").Append(extensionUrl).AppendLine("\" rel=\"stylesheet\" type=\"text/css\" />"); bundleUrls.Append("<link href=\"").Append(extensionUrl).AppendLine("\" rel=\"stylesheet\" type=\"text/css\" />");
} }
if (uiExtensionScripts != null) if (uiExtensionScripts != null)
{ {
foreach (HtmlString extensionUrl in uiExtensionScripts) foreach (string extensionUrl in uiExtensionScripts)
bundleUrls.Append("<script src=\"").Append(extensionUrl).AppendLine("\" type=\"text/javascript\"></script>"); bundleUrls.Append("<script src=\"").Append(extensionUrl).AppendLine("\" type=\"text/javascript\"></script>");
} }
@@ -17,7 +17,7 @@ namespace Disco.Web.Areas.Config.Models.Plugins
this.Manifest = response.Manifest; this.Manifest = response.Manifest;
this.PluginViewType = response.ViewType; this.PluginViewType = response.ViewType;
this.PluginViewModel = response.ViewModel; this.PluginViewModel = response.Model;
} }
} }
} }