MediaSelector In Control Designer?
Can anyone point me to an example using the MediaField? I'm assuming this is what I need to use for a PDF equivelant to the ImageField control. I have a great example of the ImageField from this link, but can't find anything that shows how to do similar for PDFs.
Thanks,
Cory
Hi Cory -
1.
var selector = this.get_Selector();
2.
3.
for (var m in selector)
4.
5.
console.log(m + ' => ' + selector[m]);
6.
01.
<%@ Control Language="C#" AutoEventWireup="true" %>
02.
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers" TagPrefix="sf" %>
03.
04.
<
br
/>
05.
06.
<
div
class
=
"document-designer"
>
07.
<
sf:MediaContentSelectorView
ID
=
"Selector"
runat
=
"server"
08.
ContentType
=
"Telerik.Sitefinity.Libraries.Model.Document"
09.
ParentType
=
"Telerik.Sitefinity.Libraries.Model.DocumentLibrary"
10.
LibraryBinderServiceUrl
=
"~/Sitefinity/Services/Content/DocumentLibraryService.svc/"
11.
MediaContentBinderServiceUrl
=
"~/Sitefinity/Services/Content/DocumentService.svc/"
12.
MediaContentItemsListDescriptionTemplate
=
"Telerik.Sitefinity.Resources.Templates.Designers.Libraries.Documents.DocumentItemDescriptionTemplate.htm"
13.
DisplayResizingOptionsControl
=
"false"
14.
ShowOpenOriginalSizeCheckBox
=
"false"
>
15.
</
sf:MediaContentSelectorView
>
16.
</
div
>
01.
using System;
02.
using System.Collections.Generic;
03.
using System.Data;
04.
using System.Linq;
05.
using System.Web;
06.
using System.Web.UI;
07.
using System.Web.UI.HtmlControls;
08.
using System.Web.UI.WebControls;
09.
10.
using Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers;
11.
using Telerik.Sitefinity.Web.UI;
12.
using Telerik.Sitefinity.Web.UI.ControlDesign;
13.
14.
namespace Designers.MediaSelectorDesigner
15.
16.
public class MediaSelectorDesigner : ControlDesignerBase
17.
18.
protected override void InitializeControls(GenericContainer container)
19.
20.
this.PropertyEditor.HideAdvancedMode = true;
21.
22.
23.
protected override void OnPreRender(EventArgs e)
24.
25.
base.OnPreRender(e);
26.
27.
28.
protected override string LayoutTemplateName
29.
30.
get
31.
32.
return "Designers.MediaSelectorDesigner.ascx";
33.
34.
35.
36.
public override IEnumerable<
ScriptDescriptor
> GetScriptDescriptors()
37.
38.
var scriptDescriptors = new List<
ScriptDescriptor
>(base.GetScriptDescriptors());
39.
var desc = (ScriptControlDescriptor)scriptDescriptors.Last();
40.
41.
desc.AddComponentProperty("Selector", this.Selector.ClientID);
42.
43.
return new[] desc ;
44.
45.
46.
public override IEnumerable<
ScriptReference
> GetScriptReferences()
47.
48.
var res = new List<
ScriptReference
>(base.GetScriptReferences());
49.
var assemblyName = this.GetType().Assembly.GetName().ToString();
50.
51.
res.Add(new ScriptReference("Designers.MediaSelectorDesigner.js", assemblyName));
52.
53.
return res.ToArray();
54.
55.
56.
# region Controls
57.
58.
protected MediaContentSelectorView Selector
59.
60.
get
61.
62.
return this.Container.GetControl<
MediaContentSelectorView
>("Selector", true);
63.
64.
65.
66.
# endregion
67.
68.
01.
Type.registerNamespace("Designers");
02.
03.
Designers.MediaSelectorDesigner = function (element)
04.
05.
Designers.MediaSelectorDesigner.initializeBase(this, [element]);
06.
07.
this._Selector = null;
08.
09.
10.
Designers.MediaSelectorDesigner.prototype =
11.
12.
initialize: function ()
13.
14.
Designers.MediaSelectorDesigner.callBaseMethod(this, 'initialize');
15.
,
16.
17.
dispose: function ()
18.
19.
Designers.MediaSelectorDesigner.callBaseMethod(this, 'dispose');
20.
,
21.
22.
refreshUI: function ()
23.
24.
var controlData = this.get_controlData();
25.
,
26.
27.
applyChanges: function ()
28.
29.
var controlData = this.get_controlData();
30.
var selectedMedia = this.get_Selector().get_selectedItem();
31.
32.
controlData.MediaId = selectedMedia.Id;
33.
,
34.
35.
get_controlData: function ()
36.
37.
return this.get_propertyEditor().get_control();
38.
,
39.
40.
get_propertyEditor: function ()
41.
42.
return this._propertyEditor;
43.
,
44.
45.
get_Selector: function ()
46.
47.
return this._Selector;
48.
,
49.
50.
set_Selector: function (value)
51.
52.
this._Selector = value;
53.
54.
55.
56.
Designers.MediaSelectorDesigner.registerClass('Designers.MediaSelectorDesigner', Telerik.Sitefinity.Web.UI.ControlDesign.ControlDesignerBase);
57.
58.
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
01.
using System;
02.
using System.Collections;
03.
using System.Collections.Generic;
04.
using System.Linq;
05.
using System.Web;
06.
using System.Web.Script.Serialization;
07.
using System.Web.UI;
08.
using System.Web.UI.HtmlControls;
09.
using System.Web.UI.WebControls;
10.
11.
using Telerik.Sitefinity;
12.
using Telerik.Sitefinity.GenericContent.Model;
13.
using Telerik.Sitefinity.Model;
14.
using Telerik.Sitefinity.Modules.Pages;
15.
using Telerik.Sitefinity.Pages.Model;
16.
using Telerik.Sitefinity.Web;
17.
using Telerik.Sitefinity.Web.UI;
18.
using Telerik.Sitefinity.Web.UI.ControlDesign;
19.
20.
namespace Controls
21.
22.
[ControlDesigner(typeof(MediaSelectorDesigner)), PropertyEditorTitle("Select Media")]
23.
public partial class MediaSelector : SimpleView
24.
25.
public Guid MediaId
26.
27.
get;
28.
set;
29.
30.
31.
protected override string LayoutTemplateName
32.
33.
get return "Controls.MediaSelector.ascx";
34.
35.
36.
protected override void InitializeControls(GenericContainer container)
37.
38.
39.
40.
41.
protected override void OnPreRender(EventArgs e)
42.
43.
base.OnPreRender(e);
44.
45.
// add your logic here...
46.
// use the fluent api to pass in the ID and retrieve a Document or Video
47.
48.
49.
# region Controls
50.
51.
// add your controls here...
52.
53.
protected Literal NoMedia
54.
55.
get return this.Container.GetControl<
Literal
>("NoMedia", true);
56.
57.
58.
# endregion
59.
60.
01.
<%@ Control Language="C#" AutoEventWireup="true" %>
02.
03.
<!--
04.
05.
Just an example...
06.
07.
-->
08.
09.
<
div
class
=
"media-selector"
>
10.
<
asp:Literal
ID
=
"NoMedia"
runat
=
"server"
/>
11.
</
div
>
Hi, I'm using your code as an example. I'm getting an error that says "already contains a definition for NoMedia", it is happening in ascx.designer.cs.
control.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="control.ascx.cs" Inherits="SitefinityWebApp.controls.PDFs.PDFCTA.control" %>
<div class="fact-sheet left">
<asp:HyperLink ID="PDFLinkURL1" runat="server" Target="_blank"><asp:Image ID="PDFImg" runat="server" /></asp:HyperLink>
<asp:HyperLink ID="PDFLinkURL2" runat="server" Target="_blank"></asp:HyperLink>
<asp:HyperLink ID="PDFLinkURL3" runat="server" CssClass="pdf-link" Target="_blank"></asp:HyperLink>
<div class="media-selector">
<asp:Literal ID="NoMedia" runat="server"/>
</div>
</div>
control.ascx.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Script.Serialization;
using Telerik.Sitefinity;
using Telerik.Sitefinity.Web;
using Telerik.Sitefinity.Web.UI;
using Telerik.Sitefinity.Web.UI.ControlDesign;
using Telerik.Sitefinity.GenericContent.Model;
using Telerik.Sitefinity.Model;
using Telerik.Sitefinity.Modules.Pages;
using Telerik.Sitefinity.Pages.Model;
using Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers;
namespace SitefinityWebApp.controls.PDFs.PDFCTA
[ControlDesigner(typeof(designer)),PropertyEditorTitle("Select Media")]
public partial class control : ControlDesignerBase
private string _PDFUrl;
private string _PDFName;
private string _PDFDetails;
public Guid MediaId
get;
set;
public string PdfUrl
get return _PDFUrl;
set _PDFUrl = value;
public string PdfName
get return _PDFName;
set _PDFName = value;
public string PdfDetails
get return _PDFDetails;
set _PDFDetails = value;
protected override string LayoutTemplateName
get return "controls.PDFs.PDFCTA.designer.ascx";
protected override void InitializeControls(GenericContainer container)
protected override void OnPreRender(EventArgs e)
base.OnPreRender(e);
// add your logic here...
// use the fluent api to pass in the ID and retrieve a Document or Video
protected void Page_Load(object sender, EventArgs e)
if(!_PDFUrl.IsNullOrEmpty())
PDFImg.ImageUrl = "~/App_Themes/Microsite/global/images/pdf-cover-fact-sheets.jpg";
PDFLinkURL1.NavigateUrl = _PDFUrl.Trim();
PDFLinkURL2.NavigateUrl = _PDFUrl.Trim();
PDFLinkURL3.NavigateUrl = _PDFUrl.Trim();
if(!_PDFName.IsNullOrEmpty())
//PDFTitle.Text = _PDFName;
PDFLinkURL2.Text = "<h2 class='left'>" + _PDFName.Trim() + "</h2>";
PDFLinkURL1.ToolTip = _PDFName.Trim();
PDFLinkURL2.ToolTip = _PDFName.Trim();
PDFLinkURL3.ToolTip = _PDFName.Trim();
PDFImg.AlternateText = _PDFName;
if(!_PDFDetails.IsNullOrEmpty())
PDFLinkURL3.Text = _PDFDetails.Trim();
# region Controls
// add your controls here...
protected Literal NoMedia
get return this.Container.GetControl<Literal>("NoMedia", true);
# endregion
control.ascx.designer.cs
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SitefinityWebApp.controls.PDFs.PDFCTA
public partial class control
/// <summary>
/// PDFLinkURL1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL1;
/// <summary>
/// PDFImg control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Image PDFImg;
/// <summary>
/// PDFLinkURL2 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL2;
/// <summary>
/// PDFLinkURL3 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL3;
/// <summary>
/// NoMedia control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal NoMedia;
Thanks for your help,
Jon
Hi Jon -
Sorry I think I've written this wrong for what I'm trying to do.
What I'm trying to accomplish in the widget is an icon, a title, and a description linking to the same PDF. The name of the file for the PDF is the title. I guess I've mucked up the code for the user control here. I assume I would still need these two files to pass the data for the IDs properly to the widget?
I am still getting the error "already contains the definition for..." for the 3 IDs PDFLink1, PDFLink2, and PDFLink3.
Here is the code again:
control.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="control.ascx.cs" Inherits="SitefinityWebApp.controls.PDFs.PDFCTA.control" %>
<div class="fact-sheet left">
<asp:Hyperlink ID="PDFLinkURL1" runat="server" Target="_blank"><asp:Image ID="PDFImg" runat="server" /></asp:Hyperlink>
<asp:Hyperlink ID="PDFLinkURL2" runat="server" Target="_blank"></asp:Hyperlink>
<asp:Hyperlink ID="PDFLinkURL3" runat="server" CssClass="pdf-link" Target="_blank"></asp:Hyperlink>
</div>
control.ascx.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Script.Serialization;
using Telerik.Sitefinity;
using Telerik.Sitefinity.Web;
using Telerik.Sitefinity.Web.UI;
using Telerik.Sitefinity.Web.UI.ControlDesign;
using Telerik.Sitefinity.GenericContent.Model;
using Telerik.Sitefinity.Model;
using Telerik.Sitefinity.Modules.Pages;
using Telerik.Sitefinity.Pages.Model;
using Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers;
namespace SitefinityWebApp.controls.PDFs.PDFCTA
[ControlDesigner(typeof(designer)),PropertyEditorTitle("Select Media")]
public partial class control : ControlDesignerBase
private string _PDFUrl;
private string _PDFName;
private string _PDFDetails;
public Guid MediaId
get;
set;
public string PdfUrl
get return _PDFUrl;
set _PDFUrl = value;
public string PdfName
get return _PDFName;
set _PDFName = value;
public string PdfDetails
get return _PDFDetails;
set _PDFDetails = value;
protected override string LayoutTemplateName
get return "controls.PDFs.PDFCTA.designer.ascx";
protected override void InitializeControls(GenericContainer container)
protected override void OnPreRender(EventArgs e)
base.OnPreRender(e);
// add your logic here...
// use the fluent api to pass in the ID and retrieve a Document or Video
protected void Page_Load(object sender, EventArgs e)
if(!_PDFUrl.IsNullOrEmpty())
PDFImg.ImageUrl = "~/App_Themes/Microsite/global/images/pdf-cover-fact-sheets.jpg";
if(!_PDFName.IsNullOrEmpty())
//PDFTitle.Text = _PDFName;
//PDFLinkURL2.Text = "<h2 class='left'>" + _PDFName.Trim() + "</h2>";
//PDFLinkURL1.ToolTip = _PDFName.Trim();
//PDFLinkURL2.ToolTip = _PDFName.Trim();
//PDFLinkURL3.ToolTip = _PDFName.Trim();
PDFImg.AlternateText = _PDFName;
if(!_PDFDetails.IsNullOrEmpty())
//PDFLinkURL3.Text = _PDFDetails.Trim();
# region Controls
// add your controls here...
protected HyperLink PDFLinkURL1
get return this.Container.GetControl<HyperLink>("PDFLinkURL1", true);
protected HyperLink PDFLinkURL2
get return this.Container.GetControl<HyperLink>("PDFLinkURL2", true);
protected HyperLink PDFLinkURL3
get return this.Container.GetControl<HyperLink>("PDFLinkURL3", true);
# endregion
control.ascx.designer.cs
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SitefinityWebApp.controls.PDFs.PDFCTA
public partial class control
/// <summary>
/// PDFLinkURL1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL1;
/// <summary>
/// PDFImg control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Image PDFImg;
/// <summary>
/// PDFLinkURL2 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL2;
/// <summary>
/// PDFLinkURL3 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink PDFLinkURL3;
designer.ascx
<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers" TagPrefix="sf" %>
<div>
<label for="txtName">Name:</label><br />
<input type="text" id="txtName" />
</div>
<div>
<label for="txtDetails">Details:</label><br />
<input type="text" id="txtDetails" />
</div>
<div class="embedDocument-designer">
<sf:MediaContentSelectorView ID="Selector" runat="server" ContentType= "Telerik.Sitefinity.Libraries.Model.Document" ParentType= "Telerik.Sitefinity.Libraries.Model.DocumentLibrary" LibraryBinderServiceUrl= "~/Sitefinity/Services/Content/DocumentLibraryService.svc/" MediaContentBinderServiceUrl= "~/Sitefinity/Services/Content/DocumentService.svc/" MediaContentItemsListDescriptionTemplate= "Telerik.Sitefinity.Resources.Templates.Designers.Libraries.Documents.DocumentItemDescriptionTemplate.htm" DisplayResizingOptionsControl= "false" ShowOpenOriginalSizeCheckBox= "false">
</sf:MediaContentSelectorView>
</div>
designer.js
Type.registerNamespace("SitefinityWebApp.controls.PDFs.PDFCTA.control");
SitefinityWebApp.controls.PDFs.PDFCTA.designer = function (element)
SitefinityWebApp.controls.PDFs.PDFCTA.designer.initializeBase(this, [element]);
this._Selector = null;
SitefinityWebApp.controls.PDFs.PDFCTA.designer.prototype =
initialize: function ()
SitefinityWebApp.controls.PDFs.PDFCTA.designer.callBaseMethod(this, 'initialize');
,
dispose: function ()
SitefinityWebApp.controls.PDFs.PDFCTA.designer.callBaseMethod(this, 'dispose');
,
refreshUI: function ()
var controlData = this._propertyEditor.get_control();
// bind widget properites to designer
jQuery("#txtName").val(controlData.PdfName);
jQuery("#txtUrl").val(controlData.PdfUrl);
jQuery("#txtDetails").val(controlData.PdfDetails);
,
applyChanges: function ()
var controlData = this._propertyEditor.get_control();
var selectedMedia = this.get_Selector().get_selectedItem();
// bind designer properties back to widget
controlData.Name = jQuery("#txtName").val();
controlData.PdfUrl = jQuery("#txtUrl").val();
controlData.PdfDetails = jQuery("#txtDetails").val();
controlData.MediaId = selectedMedia.Id;
,
get_propertyEditor: function ()
return this._propertyEditor;
,
get_Selector: function ()
return this._Selector;
,
set_Selector: function (value)
this._Selector = value;
SitefinityWebApp.controls.PDFs.PDFCTA.designer.registerClass('SitefinityWebApp.controls.PDFs.PDFCTA.designer', Telerik.Sitefinity.Web.UI.ControlDesign.ControlDesignerBase);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
designer.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using Telerik.Sitefinity.Web.UI;
using Telerik.Sitefinity.Web.UI.ControlDesign;
using Telerik.Sitefinity.Modules.Libraries.Web.UI.Designers;
namespace SitefinityWebApp.controls.PDFs.PDFCTA
public class designer : ControlDesignerBase
protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container)
base.DesignerMode = ControlDesignerModes.Simple;
this.PropertyEditor.HideAdvancedMode = true;
protected override void OnPreRender(EventArgs e)
base.OnPreRender(e);
public override string LayoutTemplatePath
get
return _layoutTemplatePath;
set
_layoutTemplatePath = value;
protected override string LayoutTemplateName
get return string.Empty;
public override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
var scriptDescriptors = new List<ScriptDescriptor>(base.GetScriptDescriptors());
var desc = (ScriptControlDescriptor)scriptDescriptors.Last();
desc.AddComponentProperty("Selector", this.Selector.ClientID);
return new[] desc ;
public override IEnumerable<ScriptReference> GetScriptReferences()
// get script collection
var assemblyName = this.GetType().Assembly.GetName().ToString();
var res = new List<ScriptReference>(base.GetScriptReferences());
var scripts = base.GetScriptReferences() as List<ScriptReference>;
if (scripts == null) return base.GetScriptReferences();
res.Add(new ScriptReference("controls.PDFs.PDFCTA.designer.js", assemblyName));
scripts.Add(new ScriptReference(_scriptReference));
scripts.Concat(res);
return scripts;
# region Controls
protected MediaContentSelectorView Selector
get
return this.Container.GetControl<MediaContentSelectorView>("Selector", true);
# endregion
private string _layoutTemplatePath = "~/controls/PDFs/PDFCTA/designer.ascx";
private string _scriptReference = "~/controls/PDFs/PDFCTA/designer.js";
Thanks again for your help
Sorry brainfart, the 3 IDs are PDFLinkURL1, PDFLinkURL2, PDFLinkURL3