I am making a SharePoint visual web part project for SharePoint 2013. The web part was working fine till yesterday but now it is giving following error.
The file
'/_CONTROLTEMPLATES/VisualWebPartProject/Export/ExportUserControl.ascx'
does not exist
I have two solutions below which discuss this problem but I don't seem to apply solution in my case.
For e.g. solution 1 below discusses that I should open my ascx page there I have registered the user control and change CONTROLTEMPLATES to _CONTROLTEMPLATES. Problem is I don't have any such line in code to change.
Similarly in solution 2 below I don't know where I should change SharePoint version path which is /15/
Solution 1
http://johanleino.wordpress.com/2010/12/08/ascx-was-not-found/
Solution 2
http://blog.entos.at/Lists/Posts/Post.aspx?ID=6
If you picked Visual Web Part (Farm Solutions Only) from Add Item menu, you should see a cs file having same name with the web part. In that cs file there exists a constant with a comment above :
// Visual Studio might automatically update this path when you change the Visual Web Part project item.
private const string _ascxPath = #"~/_CONTROLTEMPLATES/15/ProjectName/VisualWebPart2/VisualWebPart2UserControl.ascx";
You can clearly see the version (15) above.
Register the user control using the following code: (Important: remove the TagName!)
<%# Register
Assembly="BBB.XXXX.Webparts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b86a9e59abbaa56b"
Namespace="BBB.XXXX.Webparts.ControlTemplates.BBB.XXXX.Webparts"
TagPrefix="uc1" %>
You can get the assembly from web.config
then register the control like this:
<uc1:WorkflowComments ID="WorkflowComments1" runat="server" />
Related
How to set one of the folders as root folder of Documents And Media Display portlet by programmatically.PFA image
Liferay Major Version
Your question is tagged as Liferay 6 and Liferay 7. The two releases are drastically different. This answer assumes you are using Liferay 6.x since you are asking about the DDM portlet as opposed to the OSGI module.
Programmatically setting that input resource to default as a folder of your choice requires you to create a JavaServer Page hook for a JSP in the Document Library Display portlet. I am going to briefly explain how to create the JSP hook before getting into particulars.
Create a Hook
From Liferay's Knowledge base
From your command line terminal, navigate to your Plugins SDK’s hooks folder. To create a hook project, you must execute the create script. Here’s the format to follow in executing the script:
create.[sh|bat] [project-name] "[Hook Display Name]"
On Linux and Mac OS X, you’d enter a command similar to the one in this example:
./create.sh doc-lib-disp-hook "Document Library Display Hook"
On Windows, you’d enter a command similar to the one in this example:
create.bat doc-lib-disp-hook "Document Library Display Hook"
Liferay IDE’s New Project wizard and the create scripts generate hook projects in your Plugin SDK’s hooks folder. The Plugins SDK automatically appends “-hook” to your project name.
You will need to have Apache ANT installed for this to work. Please reference the following documentation if you need to install it.
https://www.mkyong.com/ant/how-to-install-apache-ant-on-windows/
Once the hook is created open it in your Liferay IDE or Liferay Developers Studio (or Eclipse).
In your IDE click the down arrow right below File (top left corner)
Choose Liferay Plugin Project from Existing Source
Double click on the doc-lib-disp-hook folder in your Plugin's SDK Hook directory to open.
You should see something similar to this (with different name).
Override JSP
Now that you have successfully created a hook plugin, we need to override the necessary file. There are two files in particular that we need for this hook
html/portlet/document_library_display/configuration.jsp
html/portlet/document_library/init.jsp
We need both files to logically walk through this example although we only need to actually override one of them.
To override the JSP's execute the following steps
Under your META-INF folder create a new directory called custom_jsp
Open up liferay-hook.xml in Overview mode
Click the Green Plus sign (to the right of Custom JSP label)
Search for both files listed above (copy and paste the URL into the window) then click save.
You will now notice you have the following directory structure.
Let's first open the configuration.jsp. This is the code that produces the GUI you took a screen shot of. Find the following code block.
<aui:field-wrapper label="root-folder">
<div class="input-append">
<liferay-ui:input-resource id="rootFolderName" url="<%= rootFolderName %>" />
<aui:button name="openFolderSelectorButton" value="select" />
<%
String taglibRemoveFolder = "Liferay.Util.removeFolderSelection('rootFolderId', 'rootFolderName', '" + renderResponse.getNamespace() + "');";
%>
<aui:button disabled="<%= rootFolderId <= 0 %>" name="removeFolderButton" onClick="<%= taglibRemoveFolder %>" value="remove" />
</div>
</aui:field-wrapper>
Inside that block you will see the Root Folder element you wish to set.
<liferay-ui:input-resource id="rootFolderName" url="<%= rootFolderName %>" />
As you can see the folder's url is already set by default to the variable rootFolderName. We need to find where that variable is first initialized.
We need not modify this file at all. I had you include it and open it so you can follow through logically.
If you notice rootFolderName is not initialized anywhere in the configuration.jsp file. Therefore we need to investigate the init.jsp file because it is an include at the top of the page. If you open that file you will notice the following block.
String portletResource = ParamUtil.getString(request, "portletResource");
if (layout.isTypeControlPanel()) {
portletPreferences = PortletPreferencesLocalServiceUtil.getPreferences(themeDisplay.getCompanyId(), scopeGroupId, PortletKeys.PREFS_OWNER_TYPE_GROUP, 0, PortletKeys.DOCUMENT_LIBRARY, null);
}
long rootFolderId = PrefsParamUtil.getLong(portletPreferences, request, "rootFolderId", DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
String rootFolderName = StringPool.BLANK;
if (rootFolderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
try {
Folder rootFolder = DLAppLocalServiceUtil.getFolder(rootFolderId);
rootFolderName = rootFolder.getName();
}
catch (NoSuchFolderException nsfe) {
}
}
This code is basically saying we are going to initialize rootFolderName blank. However if rootFolderId is set higher than 0 either by
Portlet preferences, or
Request Parameters
then we will set rootFolderName accordingly.
Conclusion
If you want to set rootFolderName to a folder of your choice programmatically by default you can a few things. The easiest thing to do would be to get the folder's id and modify the code like this
long folderIdConstant = 999999L; // place folder id here
long rootFolderId = PrefsParamUtil.getLong(portletPreferences, request, "rootFolderId", folderIdConstant );
That would set the default root folder programmatically. Just build and deploy now.
I've created and "deployed" my latest Web Part (Visual Studio grins from ear-to-ear, and tells me, "Deploy succeeded").
But when I go to our Sharepoint site, and my "sandbox" page, and Edit it, I do not see the WebPart. As the Elements file shows, it should be available from the "Financial Affairs Forms" category:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/" >
<Module Name="PostTravelExpenseWebPart" List="113" Url="_catalogs/wp">
<File Path="PostTravelExpenseWebPart\PostTravelExpenseWebPart.webpart" Url="PostTravelExpenseWebPart.webpart" Type="GhostableInLibrary" >
<Property Name="Group" Value="Financial Affairs Forms" />
</File>
</Module>
</Elements>
However, that category is devoid of the "PostTravelExpenseWebPart" I expect (or at least hope) to see there:
What might I be omitting?
UPDATE
I even went so far as to, while in Edit mode on the Web Page, expand the "Upload a Web Part" section below "Categories" after selecting one of the "Add a Web Part" links. I didn't know exactly what to upload (when browsing for a file, the File Dialog doesn't clue you in on what file extension it expects), so I, on a flayer, tried uploading PostTravelExpense.ascx
It accepted it without balking, but I do not see it anywhere (nor do I know why just the *.ascx file would be enough, but again, which file does it expect?) It doesn't allow me to upload the entire project folder.
UPDATE 2
In response to the comment below, note that The project's Assembly Deployment Target" property is set to GlobalAssembyCache
By comparing a working project with this one, I was finally able to get it to deploy without the "A Web Part or Web Form Control on this Page cannot be displayed or imported. The type could not be found or it is not registered as safe." add-time error msg.
What I had to do was check every place in the working project where the primary namespace was referenced, and make sure that the corresponding namespace in the previously-unworking project was referenced in those same places
This required not only changing some of the files visible in Visual Studio's Solution Explorer treeview, but also two that I only was able to load into the editor by searching for strings they contained, specifically:
The ***.spdata** file, which I loaded up by searching for "SafeControl"
**Assembly.Info**, which I loaded up by searching for "AssemblyTitle"
That sure was a lot of hand-wringing and head-banging and pitiful whin[g]ing for something that one would think would automatically be taken care of by the IDE - when a namespace changes, make all the necessary changes, or at least notify the coder and offer to do so! Or, barring that, at the very least give him a better clue than "A Web Part or Web Form Control on this Page cannot be displayed or imported. The type could not be found or it is not registered as safe." when the WebPart to be plopped onto the page proves unploppable.
I've got a visual web part (created with standart Visual Stuido 2012 template from "Add new item" form) with just a single <div id="newsListDiv" runat="server"></div> element. I want to programmatically add my own user control to it using the following code:
protected void Page_Load(object sender, EventArgs e)
{
NewsLine newsLine = Page.LoadControl(#"~/_ControlTemplates/MainTheme/NewsLine.ascx") as NewsLine;
newsListDiv.Controls.Add(newsLine);
}
But when I deploy the solution and add the web part to the page it shows an error page, telling me that the file '/_ControlTemplates/MainTheme/NewsLine.ascx' does not exist. But if I look into folder "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\CONTROLTEMPLATES\MainTheme" I can see that the file is present there. I've tried to set the trust level to "Full" but got the same error. I also tried adding the user control in .ascx file like this:
<%# Register Src="~/_controltemplates/MainTheme/NewsLine.ascx" TagPrefix="uc1" TagName="NewsLine" %>
<div id="newsListDiv" runat="server">
<uc1:NewsLine runat="server" id="NewsLine" />
</div>
And that way a get a compilation error: "The name 'InitializeControl' does not exist in the current context". I've also noticed, that as soon as I add Register or Reference line (with the path to my user control) to my .ascx file, the .g.cs file becomes blank! And it fills up again when I remove that line. I tried many different path writings like "../_controltemplates/", "/controltemplates/15/", etc. But none of them made any difference. I'm getting desperate here, please help!
You forgot to try one more option. It's the same when accessing the _layouts folder. You should specify the 15 hive.
The correct path is "~/_ControlTemplates/15
NewsLine newsLine = Page.LoadControl(#"~/_ControlTemplates/15/MainTheme/NewsLine.ascx")
Was running into the same issue. I had not seen the suggestion for adding the 15 to the path and this worked for me. The only other difference between my reference and yours is I do not have the ~ at the start. The / is the first character.
I have this same problem only it works when I do it in code behind but I get no luck tring to add it to ascx like any other controls I use! - God Why should everything be this different in sharepoint?!!!!
I am using sharepoint 2010 and developing a visual web part. I had javascript functions on the ascx file and they all used to work file.Now I have moved them to a single javascript.js file and deployed it to the _layouts folder on server.
And I have put the below line on the ascx file to reference to that file
<script src="/sites/xxxxx/_layouts/customwebparts/javascript.js" type="text/javascript"> </script>
and then on the ascx.cs file and I am using the methods defined in this file for eg.,
btnCancel.Attributes.Add("onclick", "{return Action(Cancel the form?)};");
But it is not working, it is not displaying the confimration box ...Am I referencing the wrong way. Please help me ....
To reference a javascript file from within a SharePoint Visual Web Part you need to use the SharePoint:ScriptLink tag (example below):
<SharePoint:ScriptLink ID="<someid>" runat="server" Name="/_layouts/...<Path>"></SharePoint:ScriptLink>
I add a layouts mapped folder to my Visual Web Part project and place a scripts folder within the default folder, which I believe is the projects name. Following this model ensures that the javascript file is always kept up-to-date during deployment. The 'Name' property in the above tag is just the path to the javascript file relative to _layouts, so something like "/_layouts/ProjectName/Scripts/myjavascript.js".
As an FYI if you want to use CSS as well there is a SharePoint:CssRegistration tag as well. I find these are the 2 that I use the most.
You should put your javascript file in the Layout mapped folder and use the SharePoint:ScriptLink tag:
<SharePoint:ScriptLink id="ScriptLink1" runat="server" Localizable="false" Name="some-layout-subfolder/file.js" />
If you have a file not found error you should check that the Localizable attribute is set to false and from Visual Studio, in the properties of the js file, Build Action should be set as Content and Deployment Type should be TemplateFile.
Check here for more details:
http://blog.netgloo.com/2014/06/19/include-javascript-and-css-files-in-your-sharepoint-2010-visual-web-part/
Brief description of the default behavior i want to override:
Creating a SharePoint list and using the "Title (linked to Item)" in a view provides a link to the DispForm for that list. By default, this link appends a Source parameter to the URL query string.
I would like to disable this behavior in some way while still retaining the default list view web part that is created by SharePoint when the view is defined.
To be clear, I know how to convert the list-view webpart to XSLT and then control this behavior. If at all possible, I'd like to keep from doing that so that the list view can still be easily supported by Help Desk and also keep the benefits of the standard list view (such as exporting to excel and so forth).
Any ideas?
Thanks in advance for your help.
Troy
SharePoint (2007) dynamically appends the source parameter in a javascript method named GoToLink. That method is defined in SharePoint's core.js file, and it can be easily customized without editing the original file. In fact, you never want to edit that file directly; it will put SharePoint into an "unsupported" state.
We'll create a solution for our customization, so it can easily be deployed or retracted in a consistent manner. Create a new Empty SharePoint solution in Visual Studio, targeted for GAC deployment. Within your project, create the following folder structure:
Templates
Layouts
1033
("1033" is for the English localization; if you're using a different language, your id will be different).
Within "1033", create a new Javascript file (we call our ours "CustomCore.js"). This will contain JUST the code we want to override from Core.js. Since GoToLink is the only thing we're interested in, let's focus on that. Here's the original from Core.js:
function GoToLink(elm) {
if (elm.href==null)
return;
var ch=elm.href.indexOf("?") >=0 ? "&" : "?";
var srcUrl=GetSource();
if (srcUrl !=null && srcUrl !="")
srcUrl=ch+"Source="+srcUrl;
var targetUrl=elm.href+srcUrl;
if (isPortalTemplatePage(targetUrl))
window.top.location=STSPageUrlValidation(targetUrl);
else
window.location=STSPageUrlValidation(targetUrl);
}
Not much to it. For our override, we just need to omit the bits that add the source parameter. From my reckoning, the modified method looks like this:
function GoToLink(elm) {
if (elm.href==null)
return;
if (isPortalTemplatePage(elm.href))
window.top.location=STSPageUrlValidation(elm.href);
else
window.location=STSPageUrlValidation(elm.href);
}
That should be it. Package up the solution and Visual Studio should interpret the "Templates" folder structure correctly when it builds the WSP (look in the generated manifest file for the TemplateFile element and that it's deploying to "Layouts\1033\CustomCore.js").
Once your WSP solution is deployed to SharePoint, we have the final step of referencing it in your Master page. In the HEAD section of your master page, you should see Core.js being referenced like this:
<SharePoint:ScriptLink Language="javascript" runat="server" Defer="True" Name="core.js"/>
We simply add a reference to the new JS file directly beneath this line:
<SharePoint:ScriptLink Language="javascript" runat="server" Defer="True" Name="core.js"/>
<SharePoint:ScriptLink Language="javascript" runat="server" Defer="True" Name="customcore.js"/>
Test it out and make sure it works. Note that this will affect ALL lists on the server to which you've deployed "CustomCore.js" and which use the master page.