Accessing static text along with Image Selector in custom widget
Following the code from Josh Morales' post on creating widgets, I am trying to create a widget to show a series of text boxes as well as an equal amount of image selectors. For reasons unknown, I can get the image selectors to work no problem, but I cannot retrieve any of the text from the widget designer. This appears to be very straight forward, but doesn't work. I have traced using the Chrome javascript console and the designer field is never accessed. The code attached is a modified version of Josh's Fields Widget.
01.SitefinityWebApp.Custom.Widgets.FieldsWidgetControl.FieldsWidgetDesigner.prototype = 02. initialize: function () 03. SitefinityWebApp.Custom.Widgets.FieldsWidgetControl.FieldsWidgetDesigner.callBaseMethod(this, 'initialize');04. ,05. dispose: function () 06. SitefinityWebApp.Custom.Widgets.FieldsWidgetControl.FieldsWidgetDesigner.callBaseMethod(this, 'dispose');07. ,08. refreshUI: function () 09. var data = this._propertyEditor.get_control();10. //Get text11. jQuery("#StuffSelector").val(data.TestText);12. 13. this.resizeEvents();14. 15. 16. 17. // load image src18. var i = this.get_ImageSelector();19. i.set_value(data.SelectedImageSrc);20. 21. // load selected page22. var p = this.get_PageSelector();23. var pageid = data.SelectedPageID;24. if (pageid) p.set_value(pageid);25. 26. // load tags27. var t = this.get_TagsSelector();28. var tags = data.TagValue;29. if (tags != null)30. t.set_value(data.TagValue.split(","));31. 32. // load categories33. var c = this.get_CategoriesSelector();34. var cats = data.CategoryValue;35. if (cats != null)36. c.set_value(data.CategoryValue.split(","));37. ,38. applyChanges: function () 39. 40. 41. // save selected page42. var controlData = this._propertyEditor.get_control();43. controlData.TestText = jQuery("#StuffSelector").val();44. 45. controlData.SelectedPageID = this.get_PageSelector().get_value();46. 47. 48. 49. // save selected image50. var i = this.get_ImageSelector();51. controlData.SelectedImageSrc = i.get_value();52. 53. // save selected tags54. var t = this.get_TagsSelector();55. var tags = t.get_value();56. if (tags != null)57. controlData.TagValue = t.get_value().join();58. 59. // save selected categories60. var c = this.get_CategoriesSelector();61. var cats = c.get_value();62. if (cats != null)63. controlData.CategoryValue = c.get_value().join();64. ,01.private string testText = "This is STUFF";02. 03. /// <summary>04./// Gets or sets the url to the selected image05./// </summary>06./// <value>07./// The selected image url.08./// </value>09.public string SelectedImageSrc get; set; 10. 11. public string TestText12. 13. get return testText; 14. set testText = value; 15. Hi Russell,
Could you post a copy of the HTML in your 2 ascx files?
Cheers,
Nick
FieldsWidget.aspx
01.<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FieldsWidget.ascx.cs" Inherits="SitefinityWebApp.Custom.Widgets.FieldsWidgetControl.FieldsWidget" %>02. 03.<h1>Sitefinity Fields</h1>04.<p><asp:HyperLink ID="PageLink" runat="server" /></p>05.<p><asp:Image ID="Thumbnail" runat="server" /></p>06.<p>Stuff:<asp:Literal ID="Text" runat="server" /></p>07. 08.<h2>Categories</h2>09.<asp:Repeater ID="CategoriesRepeater" runat="server">10. <HeaderTemplate><ul></HeaderTemplate>11. <ItemTemplate>12. <li><%# Container.DataItem %></li>13. </ItemTemplate>14. <FooterTemplate></ul></FooterTemplate>15.</asp:Repeater>16. 17.<h2>Tags</h2>18.<asp:Repeater ID="TagsRepeater" runat="server">19. <HeaderTemplate><ul></HeaderTemplate>20. <ItemTemplate> 21. <li><%# Container.DataItem %></li>22. </ItemTemplate>23. <FooterTemplate></ul></FooterTemplate>24.</asp:Repeater>01.<%@ Control Language="C#" %>02.<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI.Fields" TagPrefix="sf" %>03.<sitefinity:FormManager ID="formManager" runat="server" />04. 05.<!-- show the image preview as a thumbnail -->06.<style type="text/css">07. #Options li img08. 09. height: 50px !important;10. margin: 5px 5px 5px 0px;11. 12.</style>13. 14.<div class="sfContentViews">15. <div id="Options">16. <div>17. <div id="groupSettingPageSelect">18. <ul class="sfTargetList">19. <li>20. <label class="sfTxtLbl">21. Type in some STUFF:</label>22. <asp:TextBox ID="StuffSelector" runat="server" />23. </li>24. <li>25. <label class="sfTxtLbl">26. Select A Page:</label>27. <sf:PageField ID="PageSelector" runat="server" WebServiceUrl="~/Sitefinity/Services/Pages/PagesService.svc/" DisplayMode="Write" />28. </li>29. <li>30. <label class="sfTxtLbl">31. Select An Image:</label>32. <sitefinity:ImageField ID="ImageSelector" runat="server" DisplayMode="Write" UploadMode="Dialog" DataFieldName="Image" />33. </li>34. <li>35. <label class="sfTxtLbl">36. Category:</label>37. <sitefinity:HierarchicalTaxonField ID="CategoriesSelector" runat="server" DisplayMode="Write" Expanded="false" ExpandText="ClickToAddCategories"38. ShowDoneSelectingButton="true" AllowMultipleSelection="true" BindOnServer="false" TaxonomyMetafieldName="Category" WebServiceUrl="~/Sitefinity/Services/Taxonomies/HierarchicalTaxon.svc" />39. </li>40. <li>41. <sitefinity:FlatTaxonField ID="TagsSelector" runat="server" DisplayMode="Write" WebServiceUrl="~/Sitefinity/Services/Taxonomies/FlatTaxon.svc/cb0f3a19-a211-48a7-88ec-77495c0f5374"42. TaxonomyMetafieldName="Tags" AllowMultipleSelection="true" Expanded="false" Title="Tags" />43. </li>44. </ul>45. </div>46. </div>47. </div>48.</div>I suspect that the problem may be that you are using <asp:textbox> as the UI element.
ASP.Net has almost certainly changed the ID at the client to reflect the NamingContainer structure, and so your jQuery #id reference is wrong. You would need to pass/fetch a reference to the ClientID to make that work.
Try changing it to <input type="text" id="StuffSelector" />
ASP.Net should render that as-is, and your jQuery reference will be valid. You can style it using class="sfTxt" etc etc to conform to Sitefinity admin UI.
Good try, but the ID still gets changed:
<input name="propertyEditor$ctl00$ctl00$ctl00$ctl00$ctl00$StuffSelector" type="text" id="propertyEditor_ctl00_ctl00_ctl00_ctl00_ctl00_StuffSelector"><a onclick="return false;" id="propertyEditor_ctl00_ctl00_ctl00_ctl00_ctl00_PageSelector_ctl00_ctl00_openSelector" class="sfLinkBtn sfChange" href="javascript:__doPostBack('propertyEditor$ctl00$ctl00$ctl00$ctl00$ctl00$PageSelector$ctl00$ctl00$openSelector','')"> <strong class="sfLinkBtnIn">Select a page</strong></a><span id="propertyEditor_ctl00_ctl00_ctl00"><div> <span>Your name:</span><br> <input type="text" id="txtName"></div></span>I've not seen that behaviour before - none of my own designers behave that way.
Normally, asp.net does not mung the id on standard html elements (i.e. no runat="server") or if clientidmode="static" is specified on a server control.