AWG Blogs

Friday, April 5, 2013

Get Property by an Attribute Property Value using LINQ

//look up the attribute matching the listid using Reflection and LINQ
                Type dtoType = typeof(AppInitParamsDTO);
                PropertyInfo pi = dtoType.GetProperties(BindingFlags.Instance | BindingFlags.Public)
                            .Where(
                            x => typeof(AppInitParamsSettingsListNameAttribute)
                                .GetProperty("ListName")
                                .GetValue(Attribute.GetCustomAttribute(
x, typeof(AppInitParamsSettingsListNameAttribute)), null).ToString()
                                == listId).First();

Tuesday, March 26, 2013

JSONSelect Usage

For the simple use case of verifying the existence of a "record" in a JavaScript object, you typically need to iterate through all items. There is a one-liner approach though, thankfully.

Say you want to verify that an ID exists in
 "Body": {
  "GetListCollectionResponse": {
   "GetListCollectionResult": {
    "Lists": {
     "List": [
      {
       "ID": "{B8B000CC-EB90-4B3D-9A44-79B8A9CFCAAC}",
       "RequireCheckout": "False",
       "EnableMinorVersion": "False",
...
Verify existence with the following function:
ListExists = function(listGuid) { //search spsvcListColXmlJson for match
  var arr = JSONSelect.match(":has(:root > .ID:val(\""+listGuid+"\"))", 
   spsvcListColXmlJson.Body.GetListCollectionResponse.GetListCollectionResult.Lists);
  var retval = arr.length>0;
  return retval; 
 };
Test:
test('List Guid found in Lists collection', function() {
 ok(ListExists("{B8B000CC-EB90-4B3D-9A44-79B8A9CFCAAC}"),"list should exist");
});

Thursday, February 28, 2013

DB Access Account error when Adding WFE

If you get this error when attempting to add a WFE to a farm:

"SharePoint Products and Technologies Configuration Wizard"
"The username entered must be the same as the database access account for the server farm you wish to join. Either choose NT AUTHORITY\NETWORK SERVICE as the username or choose a different database name"

try changing the user account used for the Timer service and Central Admin app pool. Supposedly this is the account specified at installation AKA server farm account or AKA Database Access Account (as in the error message).

Confusing, I know.

This does the trick:

stsadm -o updatefarmcredentials -userlogin -password

iisreset /noforce

 http://technet.microsoft.com/en-us/library/cc288991(v=office.12).aspx

Note: you may also need to enable the SQL Server Browser service on the CA server.

Friday, February 15, 2013

Bind ViewModel Declaratively with Caliburn.Micro in Non-Caliburn.Micro App

I have an existing Silverlight App with Frame based navigation and the app is fairly stable. I wanted to look into logging interception of ViewModels and that is when I started testing Caliburn.Micro (per an answer to my question here). My aim is to gradually migrate pages over to the Caliburn.Micro framework, but not have CM take over the App at first (i.e. set the RootVisual). The closes discussion on the web I could find regarding this scenario was http://caliburnmicro.codeplex.com/discussions/260738. To do a proof-of-concept I simply combined the files from the Caliburn.Micro.ViewFirst sample project with a SL Nav template project:

- Create a new "Silverlight Navigation Application" project
-Add existing files from ViewFirst sample: IShell.cs, MefBootstrapper.cs, and ShellViewModel.cs (change namespaces if desired)
- Add necessary references to MEF and Caliburn.Micro
- In MefBootstrapper, remove the OnStartup override method, since we are not setting the rootvisual, but instead letting the App.xaml do that. Note I thought it was necessary to also override the constructor and set "base(false)" but it seems to work either way, so I left it out.
- Copy the StackPanel element and its content from ShellView.xaml into the ContentStackPanel of About.xaml
- For the declarative binding of VM, also add the following also to About.xaml:     cal:Bind.Model="Shell"  xmlns:cal="http://www.caliburnproject.org"
- At the top of the App constructor of App.xaml.cs add:             new MefBootstrapper();
- Press F5, click "About" and notice that you have a working Caliburn.Micro ViewModel View with Actions all wired up automatically!

Monday, February 11, 2013

IsolatedStorageException - "Initialization Failed"

I got this IsolatedStorageException - message: "Initialization Failed" - when using Enterprise Library. The line giving the error is in StorageAccessor.Silverlight.cs
            this.store = IsolatedStorageFile.GetUserStoreForApplication();
I've gotten this error before in other circumstances, and usually occur right after I delete the Isolated Storage for a particular URL and reopen the app.

Tried rebooting, recompiling, reinstalling Silverlight runtime. Finally what worked was deleting this folder: C:\Users\User.Name\AppData\LocalLow\Microsoft\Silverlight

Apparently there is some corrupted state left over in there. I also noted that around this time I was unable to delete other app stores.

Thursday, January 24, 2013

XML/Javascript Mapping with Jsonix

I needed a way to edit an XML config pulled from a SharePoint List (via SPServices). So that's when I found Jsonix, which so far in my testing appears to do the job quite well.

The steps I took were:
- Load the XML in Visual Studio and click XML, Create Schema. This created two .xsd files "MySettings.xsd" and "MySettings1.xsd" (in the same directory) as Visual Studio 2010 split them out by namespace apparently. At any rate, what I had to do was edit the xs:import element in the parent XSD, adding a schemaLocation attribute with the unqualified name of the second .xsd file.

- Downloaded jsonix-scripts-1.2-all.js and jsonix-full-1.2.jar   from http://repo2.maven.org/maven2/org/hisrc/jsonix/  -- note, I tried 1.0 per the how-to on the author's site, but it didn't seem to work for me (got errors which I didn't have the time to troubleshoot); however 1.2 worked like a charm, although the generated objects are rather cryptic.

- Ran C:\temp\jsonix-samples-po-1.0>java -jar lib/jsonix-full-1.2.jar -d src/main/webapp/js src/main/resources/MySettings.xsd
This generated two folders with a Mappings.js in each folder, corresponding to the two .xsd files. I combined these two .js files into one, putting the code from generated\Mappings.js at the top of the file and the code from settingsuri\Mappings.js (assuming "SettingsURI" is the root xmlns) at the bottom.

- I then uploaded my sample .xml and the .js files to the SharePoint list and placed the following code in a test .html page.


<script type="text/javascript" language="javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript" language="javascript" src="jquery.SPServices-0.7.2.min.js"></script>
<script type="text/javascript" language="javascript" src="jsonix-scripts-1.2-all.js"></script>
<script type="text/javascript" language="javascript" src="BothMappings.js"></script>

<script type="text/javascript" language="javascript">

    $(document).ready(function () {
 
var context = new Jsonix.Context([ settingsuri]);

var unmarshaller = context.createUnmarshaller();
var myURL = "MySettings.xml";
unmarshaller.unmarshalURL(myURL,
function (data) {
var objectFromURL = data;
alert(objectFromURL);
});

    });

</script>

- Turn on Debugging in IE Developer tools and place a breakpoint in the callback. The local watch clearly shows objectFromURL reflects the mappings of the XML file. Pretty sweet.

Sunday, January 13, 2013

Dev on Alternate Machine

This is for when you want to work on a different SharePoint 2007 dev machine but not have to change host name configuration entries in your Silverlight code.

- edit the Windows hosts file adding
127.0.0.1 yourPrimaryServerName

- add yourPrimaryServerName as a public url for the intranet zone of your web app in the alternate access mappings

- add a host header value of "yourPrimaryServerName" to the site's IIS 6 configuration

- set DisableLoopbackCheck see http://support.microsoft.com/kb/896861
- add the following files to c:\inetpub\wwwroot (or a subdir, check IIS for the actual root dir the 80 site)

clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>

<grant-to>
<resource include-subpaths="true" path="/"></resource>
</grant-to>
</policy>
</cross-domain-access>

</access-policy>

crossdomain.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- The file must be configured to allow access to the service from any other domain,
or it is not recognized by Silverlight 4.
Save the crossdomain.xml file to the root of the domain where the service is hosted.
If, for example, the service is hosted in http://fabrikam.com,
then the file must be located at http://fabrikam.com/crossdomain.xml.
-->
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>

</cross-domain-policy>
ref