Showing posts with label Issue. Show all posts
Showing posts with label Issue. Show all posts

Tuesday, 8 July 2014

.NET | Issue | CSV export giving corrupted chars for non english characters Â

Someone asked me today about an encoding problem they were having, its amazing, encoding issues have been around since the beginning of computers, the requirement to export international data to files or pages and having the reader interpret the characters correctly is pretty common, I would go so far as to say that about half of every big projects has some form of requirement around that.

So then we come to why the issue shows up? "Ive debugged and can see the data from the database is being shown correctly but when i export it to the response, the special characters come back as gobbledygook, even the pound symbol is coming back as '£'"

what do you do?

  1. Check the data in the database is stored correctly and it is getting to the response without being corrupted
  2. Check you are setting the ContentEncoding correctly, what do you need to use? UTF8 is always a good one to use if you are unsure
  3. Make sure you are using the right BOM (Byte Order Mark)! (this is nearly always the issue with unexplained chars with the correct encoding, see below

if you want to know more about BOM, have a look at this - http://en.wikipedia.org/wiki/Byte_order_mark

Saturday, 15 June 2013

SP2013: Calling SP.ClientContext for an anonymous user causes "object doesnt support this method"

Good Morning!, and what a wonderful Saturday morning it is, the scent of strawberries are in the air!

So I've been working on a public facing 365 website lately and making a few customisations, one request I received was to have the ability for users to add an item to a "mailing list" list, and they wanted maximum portability, so I thought, perfect for the JS-CSOM!

Such a simple idea, add an item to a list, just needs one field adding in very straight forward, or so I thought, so I created the js function and hooked it up, for auth users it worked like a charm but I ran into a problem when accessing it anonymously, I got the error "object doesn't support this method" when calling a new "SP.ClientContext", its a straight forward error meaning it cant find the function in any loaded libraries, so I thought right, gotta be SP not loading sp.js, simple, add a script link in there... no luck the same error came up, then I thought right, gotta be that the method is running before SP.js is properly loaded so I used "ExecuteOrDelayUntilScriptLoaded()" to encapsulate my code and make sure it runs after the code is loaded, published the js and checked it again... no luck!

So it has to be sp.js not loading correctly, remembering the SoD SharePoint is so fond of I then tried the trusty "SP.SOD.executeFunc('sp.js', 'SP.ClientContext', addToMailingList)", and it worked perfectly!

Code:

$("#ben-mailinglist-confirm").click(function () {
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', addToMailingList)
});

function addToMailingList(metadata) {
    var metadata = $("#ben-mailinglist-email").val();
    if (metadata != "") {
        var clientContext = new SP.ClientContext("/");
        var list = clientContext.get_web().get_lists().getByTitle('MailingList');

        var itemCreateInfo = new SP.ListItemCreationInformation();
        var listItem = list.addItem(itemCreateInfo);
        listItem.set_item('Title', metadata);
        listItem.update();

        clientContext.load(listItem);
        clientContext.executeQueryAsync(
       Function.createDelegate(this, function () { $(".ben-mailinglist-success").show(); $(".ben-mailinglist-form").hide(); }),
       Function.createDelegate(this, function () { $(".ben-mailinglist-failure").show(); })
   );
    }
    else {
        // validation
    }
}

Wednesday, 5 June 2013

SharePoint Online (Office365): Profile images broken / not coming up

Today I had a brilliant issue, I have a 365 authenticated site that uses profile images, these are surfaced in the "ContactFieldControl", I added profile pictures to the profiles and navigating to the mysites worked fine and the profile picture on the contactfieldcontrol worked too but then I opened it in a different browser and the profile image was broken in the webpart, that was strange I thought maybe an MS Job had deleted it so I went to the mysite and the image was there!, so I navigated back to the site and once again it shows up

So it appears if the image is loaded through the contact field webpart it shows as a broken image but if you navigate to the mysite or the image directly it worked

So how to fix it?

this issue appears to be in the first load of an image using the direct path to the image, i was hoping a cache clear or an update of the profiles would fix but but to my knowledge there is no OOTB way of fixing this so i resorted to using a dev's best friend, jQuery!

First I tried running a piece of jQuery on the page to preload the image using an ajax call but that didn't work

Then I noticed something interesting, whilst fiddling the page I saw that it also calls the following URL "/_layouts/15/userphoto.aspx?size=S&url=********", this URL links directly to the image, I thought this was interesting so I wrote a piece of jquery to take the source of the image and transform it into a URL like the one above and hey presto it worked!!

Code:
function checkProfileImages() {
    $(".ben-imgborder img").attr("src", "/_layouts/15/userphoto.aspx?size=S&url=" + $(".ben-imgborder img").attr("src"))
}

Monday, 6 May 2013

Installing SharePoint Designer 2013 Issue: You must uninstall office pro plus first....

I came across this issue a while back while setting up a new development environment, i had installed VS2012, Office 2013 and was trying to install SPD 2013, I ran the setup and during the preflight checks it failed with the following message:


Why? why on earth must I un-install office to install SPD?, well as it turns out Office 2013 added a registry key(typical...) that the preflight checks, this key looks as though its not needed but is still added, possibly something that was meant to be deleted but wasn't.

So to fix it!:
Open regedit.exe (Run -> regedit -> Enter)

Find and delete the following key: HKEY_CLASSES_ROOT\Installer\Products\00005102110000000100000000F01FEC 
Note: if you can't find the above key, just find the key with prefix: 00005102, and suffix: F01FEC, and delete it. (Before deleting it, backup this key by exporting it, never a good idea to mess with the registry before backing up the original state).

Now that that's gone, try the installer again, hopefully it should now let you install SPD unhindered! 



Thursday, 11 April 2013

SharePoint Issue: Exception has been thrown by the target of an invocation while adding a CQWP

Summary Info:
SharePoint Version: 2010 Standard
OS:Windows 2008 R2

So, Yesterday I had another fantastically inexplicable issue.

I have this solution, this solution deploys a site definition, when the site is created, it activates a custom feature that processes the more complex requirements of the site, including some CQWP's whereby you been to set the listguid and weburl properties.

This solution was build and on both Dev and UAT it worked like a dream, but then it came to the production deployment, solution deployed, features activated, everything was looking rosey, until I tested creating a site, then boom "an unexpected error has occurred for correlation id.....", so there was me thinking there is an issue with the deployment that got glazed over, I checked the ULS logs for the correlation and there I found:

 Error Message   Exception has been thrown by the target of an invocation.   
  Error Stacktrace:  at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)  
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)  
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)  
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)  
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)  
   at Microsoft.SharePoint.WebPartPages.SPPropertyInfoPropertyEntry.SetValue(Object control, Object value)  
   at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.ExtractLinks(Object property, Object value, Int32 propertyLocation)  
   at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize(PersonalizationScope scope)  
   at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.get_Links()  
   at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore(WebPart webPart, Int32 viewId, String viewGuid)  
   at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked)  
   at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked)  
   at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex)  
   at {Logic Namespace}.AddCQWebPart(SPWeb rootWeb, SPLimitedWebPartManager webPartManager, String webpartName, String zoneId, Int32 zoneIndex, Guid listId, String url)  

What! what the hell is that!, the content query web part couldn't be added, OK!,  well that could be one of many issues:

  • SharePoint feature corruption
  • CQWP I'm referencing isn't there
  • Namespace is invalid
  • Couldn't set the properties

So I checked the webpart in the gallery, it looked ok, I added a webpart to the page through the UI, configured it to look at the list and it worked! so the .webpart is fine, the namespace and features are fine, so it looks like the property setting.

I removed the code setting the properties and still the error occurred  so as a process of deduction i took property after property out of the webpart until i found the properties breaking it, after taking the MainXsl, HeaderXsl and ItemXsl properties out of the .webpart file, the web parts deployed, why? good question!

So the SC I was deploying to was root and at "/" of the webapp so it cant be the URL of the properties.

Just to make sure I programatically set the urls of the xsl to the correct urls, when I did this I got another error!

 Error Message   Object reference not set to an instance of an object.   
  Error Stacktrace:  at Microsoft.SharePoint.Publishing.WebControls.CmsDataFormWebPart.MakeSiteRelativeUrl(String xslServerRelativeUrl)  
   at Microsoft.SharePoint.Publishing.WebControls.CmsDataFormWebPart.SetXSLLink()  
   at {Logic Namespace}.AddCQWebPart(SPWeb rootWeb, SPLimitedWebPartManager webPartManager, String webpartName, String zoneId, Int32 zoneIndex, Guid listId, String Url, String& errorMessage)  
   at {Logic Namespace}.AddCQPageWebPart(String pageUrl, String webPartName, String webPartZone, String listName)  

Ok now we're getting further down the rabbit hole!

Then I started investigating the context properties programmatically and found that when deploying this the HttpContext was null. I know this has been known to mess up some context sensitive operations. so I added the following before I attempted to instantiate the webpart to add:

 if (HttpContext.Current == null)  
 {  
      HttpRequest request = new HttpRequest("", rootWeb.Url, "");  
      HttpContext.Current = new HttpContext(request, new HttpResponse(new StringWriter()));  
      HttpContext.Current.Items["HttpHandlerSPWeb"] = rootWeb;  
 }  

and viola! the web part started to deploy!

So in conclusion, the CQWP is very context sensitive, and to do anything programatically, make sure you have access to a HttpContext