Program.X musings from the Isle of Man concerning ASP.NET, in particular accessibility, web standards and neat ideas.
I am a Member of the British Computer Society with Chartered IT Professional (CITP) status.
Sitecore Certified Developer
Follow me on Twitter: @programx
Welcome on board! Can't wait for your posts and the name & shames! Hope you don't come across my sites ;)
Excellent! I like to hear about ASP.NET being man-handled to XHTML compliance and would be interested to hear what method you have used for this. Good luck with your project, and I would be most ineterested!
Apologies for the horrendous text output, the editor wasn't too happy.
Interesting stuff. You can use style overrides to improve the outline of source code you want to add. I use it in my blog, for example: http://bloggingabout.net/blogs/jschreuder/archive/2005/08/03/8760.aspx
Right, thats it. I'm leavin' well alone now! I'm compiling a list of tips to deal with these issues.
Which browsers did you tested this with and which browser was used to make the screenie?
I tested this with IE and Firefox, and I created the screenshot using IE 6. However, a mate has proven me wrong! He has it working, with exremely similar CSS - and the only differences are such that I can't understand how it would affect the position of the bullet-images. (font styling, the list-xxxx styles are the same)
There's another way to do it - use a background-image and some extra with some extra padding-left on the li tags, set the background image to sit at the top of the element. Something like this (untested, but should be near enough!): li { background: url(folder.gif) no-repeat left top; padding-left: 20px; /*(width of image, plus a couple of pixels for spacing)*/ }
This will remove the awful span tag from the rendered HTML: protected override void Render(HtmlTextWriter output) { //Quick fix to remove the span StringWriter writer = new StringWriter(); HtmlTextWriter buffer = new HtmlTextWriter(writer); base.Render(buffer); string labelMarkup = writer.ToString(); int index1 = labelMarkup.IndexOf("<label"); int index2 = labelMarkup.IndexOf("</label"); labelMarkup = labelMarkup.Substring(index1,index2-index1+8); output.Write(labelMarkup); }
Pre-populatiing your fields gives a further hint to the user Following on from my post Accessible Forms:...
Nathan, MSDN has published an article on ASP.NET 2.0 and accessibility last week. Check out http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/aspnetusstan.asp and http://weblogs.asp.net/scottgu/archive/2005/09/03/424363.aspx. There are still some problem areas according to Sven Groot: http://idunno.org/displayBlog.aspx/2005090201.
Err that's not Sven, that's me :)
Thanks Erwyn, I've read all articles and will no doubt post on this later. Unfortunately, I do not have the platform to test Beta 2 :(. I've ordered it, but for some bizarre reason their form does not let me receive a copy in the Isle of Man! (I've sent it to someone in the UK). My initial concerns are (a) its a spoiler to my future posts! and (b) overloading ASP.NET is not necassarily the answer.
I am sorry to disagree. I think it's wonderful to have set-based query logic as a first-class citizen in C#. This will increase developer productivity a lot. LINQ has no dependencies on SQL. Although one form of the LINQ syntax is SQL like, it absolutely doesn't matter where the data comes from. In the case of DLINQ the queries are translated to T-SQL and executed in a SQL Server database. This will give you the same performance as calling a stored procedure.
I don't dispute that it isn't really useful. It would be awesome to sort collections, etc. And I am keen to play - unfortunately I have to wait as MS didn't see fit to send me my pack - but I would be resistant to replacing my data-layer.
The person who wrote this article is sooo waay off, next thing he'll tell us is that we should be able to deploy assemblies to a database ;-). Set based operators belong in programming languages, i've actually missed them a lot in C#. Maybe looking at LINQ as 'syntactic sugar' over C# 2.0 to make developers more productive makes this more acceptable? It really is nothing more (or less). Unless people start to deploy shared data (databases) with client applications or load gigabytes of data into a client's memory to do datawarehouding, i think everything that whatever should be at the back stayed at the back. You can download the LINQ compiler preview at http://msdn.microsoft.com/netframework/future/linq/
Doesn't the Label web server control built into ASP.NET already take care of this need? For me the following design time code: >asp:Label id="lblName" runat="server" AssociatedControlID="txtName"<Name:>/asp:Label< >asp:textbox id="txtName" runat="server" CssClass="input-box"<>/asp:textbox< renders as: >label for="txtName" id="lblName"<Name:>/label< >input name="txtName" type="text" id="txtName" class="input-box" /< Why build a custom control to do what ASP can?
I think you might be talking about ASP.NET 2.0? The ASP.NET 1.1 Label control merely outputs a mess of spans.
This is a great explanation of some of the important aspects to make an (X)HTML page accessible. You'll be happy to know that a lot of these tricks were employed by the accessibility/CSS expert on the project I have been working on. Unfortunately the site is not live yet due to some major content conversion going on, so I can't give you the URL.
This continues on from a previous entry at my post for 14th November 2005. It discusses the site at http://www.zoomthegroom.co.uk....
It depends on the situation. If you want to upgrade your personal skills then the express edition's are a good alternative. On the other hand.. they are all seperate ide's. When your in an enterprise or commercial environment you just can't ignore visual studio anymore. Because you can do more in less time. I don't know is there are trail versions available but that would be my next option for personal use. Just running the trail edition within a virtualized environment for personal use.
If it's an IDE you want, and your company cannot invest in VS2005 yet, have a look at http://www.icsharpcode.net/OpenSource/SD/ It's an open source IDE for .Net. Not sure if the 1.1 version already supports 2.0. I do know there's a beta version 2.0 for which you can find more info here: http://community.sharpdevelop.net/forums/23/ShowForum.aspx
Ok,so the example isn't anywhere close to XHTML. Not my fault, can't be bothered fighting with the editor! You get the point though. :)
IIRC the html spec uses an "name" attribute (istead of "id", which is used in aspx). The currect tags should be: <input type="hidden" name="cmd" id="cmd" value="_xclick" /> <input type="hidden" name="return" id="return" value="returnurl.aspx" /> (but will have to admit it has been a while)
(nevermind my comment, failed to read the whole post)
Nathan, it's not server controls in general that get assigned a name attribute by ASP.NET, but only form fields. The name attribute is a different beast than the id attribute. E.g., in XHTML (as XML with a DTD), the id attribute should not have duplicate values in a document. While the name attribute should have duplicate values for radio button groups. How would you do this in XHTML without using the name attribute?! That's why it's even a REQUIRED attribute on most form fields according to the annotated XHTML 1.0 Strict DTD (http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict). In form submittal, by design, the browser posts the name attributes and not the id attributes. If W3C were to deprecate the "name" attribute on form fields in XHTML, it would show that they don't understand backwards compatibility. Backwards compatibility is not something to be taken lightly. I think it is great you can output XHTML 1.0 Strict with ASP.NET (which is valid according to the DTD) that works in older browsers which process this as tag soup. The world isn't going to move to browsers that only process valid XHTML anytime soon, as that would leave 95%+ of the content on the Internet behind. I think ASP.NET 2.0 is a very good step in the right direction without sacrificing backwards compatibility.
Implicit typed variables: This is a c# feature that I am waiting for since I started programming! You really cannot compare it with variants because variants arent typed. Variants are just luxurious object references that still need interface casting to get the correct interface to work on. var a = new int[] { 1, 2, 3 }; If you would debug this code then a will really be an integer array. Var is not really handy for standard types. It is very easy in scenarios where you have lots of data classes or situations where you don't have a stable data model yet. Faulty variant handling can only be detected at runtime while the var keyword is replaced inline by the compiler with the return type of the expression being a method or statement. So you have compile-time checking of your code. Object initializers: I've always learned that constructors are there to initialize the invariants within your class. This reason will not change at all. This is just an aditional way of initializing object where normal invariants can always be initialized by the default constructor.
Ramon, I have to agree with Nathan here. What's the point of having var. To me it sounds completely useless. Wow, the compiler replaces it with in integer array if you declare: var a = new int[] { 1, 2, 3 }; I can't think of any situation where you wouldn't just declare: int [] a = new int[] { 1, 2, 3 };
I definitely see the power of C# 3.0 which means a lot less redundant typing. It also means C# can handle situations where you cannot sensibly specify the types you are using. For example when projecting out only a couple of fields using LINQ in a nested query. C# 3.0 definitely stays on the strongly typed side of the language spectrum as Ramon explains. Don't let the vars fool you! I have programmed a lot in JavaScript in the past (and in fact I am doing this for my current project) and I like the power of dynamically typed languages. VB 9.0 will have the best of both worlds ;) Only the syntax sucks ;(
My cents on this issue: var has nothing to do with dynamic typing, such as in JavaScript, Perl or Ruby. The compiler infers the actual type from the expression went it is initialized. Also, I find that examples such as var foo = new int[] { 1, 2, 3 } could mislead the programmer into thinking it has no place in C#. var is not intended for these situations, because you know the exact type beforehand. Instead var is meant for situations where a new anonymous type is created, such as by projection from a linq expression. var q = new { Name = "Alex", Age = 34 }; Now you do not know the name of the type, because it is not given a name by yourself, but by the compiler. This is not lax programming, but programming with types beyond your initial data and object model.
lol @ erwyn :) Check out this explanation by Alex Thissen (my colleague :) about vars : http://www.alexthissen.nl/weblog/DetailsView.aspx?PostingID=593a19b3-fcfb-4c5d-9155-d96098f11064
It would be difficult to do. You can't inherit from System.Int32 either. In fact, you cannot inherit from any valuetype in .NET. This is by design. Valuetypes can live "unboxed" on the stack and in that case don't carry a type identifier for the instance. Allowing inheritance would mean you could substitute an instance of a class derived from a valuetype for that valuetype. If you would be able to override a method in the derived class the runtime would have a hard time figuring out which method to call because it can't see if it is dealing with an instance of the parent class or an instance of the derived class. Or in other words valuetypes and polymorphism don't mix very well.
Check out http://blogs.msdn.com/joelpob/archive/2004/07/19/187709.aspx for more details.
YES! I've been wanting that ever since I first learned of enumerations (about 10 years ago ;-).
I think an exception could be made for the enum value type with regard to the inheritance restictions. I dont see anything wrong with inheriting from an existing enum.
Maybe its even enough to implement it as syntactic suger that just copies all the entries of the base type...
I'm tackling a similar problem, and I've come up with a solution that you may or may not like.
(I use vb but you get the idea)
Public Enum StronglyTypedEnum As Int32
CommonEnum1 = 0
CommonEnum2= 1
CommonEnum3= 2
ClassSpecificEnum = 4
End Enum
Public Class BaseClass
Public Const CommonEnum1 As StronglyTypedEnum = StronglyTypedEnum.CommonEnum1
Public Const CommonEnum2 As StronglyTypedEnum = StronglyTypedEnum.CommonEnum2
Public Const CommonEnum3 As StronglyTypedEnum = StronglyTypedEnum.CommonEnum3
End Class
Public Class InheritedClass Inherits BaseClass
Public Const ClassSpecificEnum As StronglyTypedEnum = StronglyTypedEnum.StronglyTypedEnum
Now if you we can do this:
Dim value As StronlyTypedEnum
value = InheritedClass.CommonEnum1
value = InheritedClass.CommonEnum2
value = InheritedClass.CommonEnum3
value = InheritedClass.ClassSpecificEnum
---------------------------------
Of course with this method you lose the ability to use Enum specific methods, but if you are just after the values, as I am usually this works quite well. The other pain is that you have to maintain the StronglyTypedEnum Enum separately, but it's a good solution if you care about strongly typed values rather than simple int32's.
Hi Nathan, good explanation, there are a few things I would just like to bring to your attention. Contry to what a lot of people will tell you, setting elements to display:none; is not an accessible method. Newer screen readers are now taking the display:none property literally and not displaying it, JAW's for one. A mush better method is to give the element a position:absolute; and left:-999em; This removes it from the viewport but it still displays to a screen reader. In this case you could always wrap the image in an <h1> which will give the alt text the structual importance required.
Excellent reading. I totally agree. I'm assigned to a project where they use Log4Net and it took me days to get it to log what I wanted. In theory these projects sound terrific, but when you try to use them in the eral world, you run into all sorts of problems. For commercial projects, I prefer the commercial tools. As simple as that.
Nathan, thanks for sharing your story. It's an interesting read.
I finally got around to read your article, and it's an excellent read! I've always said open source isn't what a lot of people expect, and you provide some good examples.
This one's bookmarked and will be forwarded in the future!
Thanks
Thanks for all your positive feedback, much appreciated.
I was talking to a colleague about the quality of open source, and he has noticed that a lot of open source projects now come with a "higher tier" product, which offers more features and comes with support - and a price tag. This seems to me to be an even better deal than shareware.
Luckily there is a browser that behaves the same on all systems called firefox :)
Really.. I cannot life without it. I have FF installed at home (xp-sp2 & ubuntu 6.1x) and at work and all those plugins are awesome like the bookmark plugin, the web developer toolbar, the weather pluging, the built-in dictionary, the advertisement remover, bugmenot.
It really is a mystery to me why a developer would want to use IE7.
And about an easy way to get to your dashboard. I really don't know where to find the link :). Just remember the word 'controlpanel' by saying this 100x times.
http://bloggingabout.net/controlpanel/
I use IE 7.0 and FireFox 2.0 on both Windows XP and Windows Vista. All configurations have crashed on me (say once a week), but I notice no significant differences in stability.
I've never experienced a crashing IE 7. I work with it on a daily basis on a Windows XP machine.
@ Ramon Smits:
"It really is a mystery to me why a developer would want to use IE7."
A developer would want to use IE7 since IE6 has a massive market share, and IE7 will take over IE6's reign with giant leaps. It's just a matter of time (especially with Vista around the corner), and since you'll want to make sure your app works with the most popular browser it's imperative you check your app with IE7.
BTW, I use Firefox 2 at home myself, so I am certainly not anti-Firefox or anything.
I agree Ramon. Just because I am a developer doesn't mean I can't have free choice. I prefer to use IE7 because it is cleaner and has a new tab button - which bizarrely, Firefox does not have by default - although I did find a key combination when you click the refresh button that does the same.
So long as it works in all browsers (particularly ones that occupy 90% of the market ;) ), it matters not.
I guess I have a bd install :(. May explain VS randomly corrupting my web.config file, too. Which is great fun. That Visual Studio, it;s such a joker! :O
Good advice. I've implemented this custom control in a project I've got going, and it works mostly as advertised. However, I still seem to get an extra SPAN wrapped around the outputted LABEL, in the final markup. Did you have this happening to you with your custom code?
Replying to myself, here. Really annoyed at this, as I have wasted 2 days on a fairly urgent project on figuring out what is and isn't supported under VS 2005.
Anyway, I have managed to force the install of Visual Studio 2005 Extensions for WinFX. You use:
msiexec /i vsextwfx.msi WRC_INSTALLED_OVERRIDE=1
As a command line to install the MSI. Then it works. Of course, I don't think it allows me to host services with IIS hosted endpoints, but that is another battle.
Found at: forums.microsoft.com/.../ShowPost.aspx
As it turns out, I've had enough of wasting valuable time, and am reverting to good ol' ASMX + XML to implement my complex pan-location-and-server processing. Without this WCF reason to upgrade, I don't see my department upgrading to 2008 within the year, which is not good for my learning and development opportunities.
It would certainly help to either deter all the hobbyist .Net Devs or force them to become educated :)
I agree with a lot of what you say.
Certainly, one way of giving the BCS more teeth would be to make sure more people are aware of it, both those working directly in information technology (ie: colleagues) and those relying on it (ie: clients in the broadest sense).
It is interesting to compare the IT profession as it stands with others, such as chartered surveying. The ultimate goal of any graduate entrant in to this profession is to become a Chartered Surveyor.
I think we need to move to a position were entrants into our own profession aspire to call themselves Chartered IT Professionals, so there is a distinction between the professionals and the bloke on the street corner.
It is important to remember that a Chartered IT Professional is equivalent to the chartered grades of other professional bodies in the United Kingdom, such as Chartered Accountants and Chartered Architects, and is recognised as such by HM Government.
You might be interested in a slightly contentious article on my blog at blogs.rrs.co.uk/.../PermaLink,guid,823c1e35-dfd9-4c8e-a40d-70b7aa5df5e4.aspx, which touches on professionalism within web design.
Alastair Revell
(Chartered IT Professional)
Managing Consultant
Revell Research Systems
www.rrs.co.uk
Pingback from Fashion » Still no viable Content Management solutions?
Cool, thanks a lot for the feedback on the systems. We're aware of the issues with Sitecore Xpress when it comes to databases.
We didn't got the possibility to change our original product for the Xpress release, and actually we don't want too. The system should be directly derived from our Trunk.
I'm currently investigating the possibilities to create 1 SQL Server database out of it using Schemes, but I'm not sure this will work out.
But I'm very glad you took the time evoluate. Please feel free to contact us using our Forums on SDN(http://sdn.sitecore.net) or contact a local office.
We'll collect them and make sure they will be fixed in the upcoming release.
Kind regards,
Alex de Groot
Solution Architect
Sitecore International
Warning - very long comment. Disclaimer: I'm the founder of the umbraco project ;-)
There's never one system to rule them all - that's why there are so many cms's out there.
> I played with it for a while, but was not pleased
> with the output of XHTML and open-source worries me.
Just out of curiosity, what do you mean by the "not pleased with the output of XHTML"? umbraco is second-to-none when it comes to a cms leaving your markup intact and making it easy to produce valid xhtml strict sites - like our own :)
It's very easy to customize the looks of umbraco, like replacing the section icons in the lower left corner (it's just image files). However a lot of people like the anonymous design of the application, which doesn't takes focus away from what's essential - the content of your site.
Regarding the worries of open source, umbraco is a commercial open source project under the MIT license. The MIT license means no string attached (unlike the GPL and other copy-left licenses where there's a risk that using such a product means extra obligations for your work thats based on the product).
Being a commercial open source product, it means that you can get support, that there's people working full time on the platform, etc. The only difference is that at least for web cms, a paradigm shift has come where it's actually so (relatively) cheap to develop software that using the open source model for distribution is profitable (for us at least).
There's a ton of myths when it comes to open source one of them is that open source is free and also that people tend to compare them with "traditional software packages" - both there *are* big differences on both sides. A traditional product often consist of a box, documentation, manuals, a cd-rom (dvd) - and indirectly printed brochures, ads, sales meetings, etc. On the open source side, the only thing you get for free is the "bits" which most of the cases are downloaded.
This has two perspectives, from the open source side it's very interesting that you can get a product distributed with a close-to-zero marketing/sales budget. The sales cost of a traditional product is at least 50 percent of the retail price, often much more. Another thing that often add to the price of a closed source product is the lifetime cycle of the product. By this I mean that the expenses of maintaining/selling a closed source product doesn't stop once the product is sold. Often you have customer services and support which also add costs which is a part of the retail price.
With an open source product the marketing costs are close-to-zero, the distribution costs close-to-zero and the lifetime cycle costs zero. This means that the costs of developing and maintaining an open source product is the development and management costs alone, and in software that's often the lowest part of a budget for a software development company.
If umbraco users needs the usual gains from a closed source product like support and training, we offer that. But you only pay for the services you need. In my opinion it's the best of both worlds (however, I'm not saying that it'll work with any type of software product, but for us it was a match made in heaven).
Being an open source project also means involvement and this is where many oss projects suffer from bad or no management at all. Many projects gets bloated because developers love to add features, but care much less to maintain, design and polish existing ones. And often there's no real vision for the project. Many closed source projects suffer from the same, but they die. The get out of business. That doesn't happen to the open source projects as that type usually just attracts more and more hobby programmers who're pleased that no one questions that yet-another-useless-feature gets added. Building great software takes great management and the courage to say no and the ability to listen and focus on what matters for the people who uses your product. And that's no matter whether it's closed or open source.
But if you have great management AND a great community you can get a lot of advantages from not being a silo project where all discussions and development are kept secret within company walls. You can turn your users into participants and gain from a massive collective intelligence. When it works, it's phenomenal and way beyond what's possible being closed (not just in source but also in mindset).
At the same time, an open source company have the advantages of a *very* viral distribution form if your product fits the market. We grew 991% last year and 350% the year before that. With a close-to-zero marketing budget. That's not only insane, but absolutely impossible without an extremely viral model.
Having a large distribution (umbraco has grown from 1.500 installations to almost 50.000 in two years) means that you get a big install base where you can offer smaller and cheaper products. You'll need to think different but it does indeed pays of.
As I said - for many types of software a paradigm shift is happening and open source is not different. It's not magic, not voodoo. It still takes great management and a piece of software doesn't get better just because it has a 0$ price tag. Crap is still crap no matter how cheap it is. But if you combine the best from both worlds you get something that's very powerful - and profitable.
Feel free to contact me at nh (a) umbraco [.] dk if you get further questions :-)
Cheers,
Niels / umbraco
"
Hi Nathan,
I'm sorry to hear that you had problems with using our software, Kentico CMS. Did you try to contact our support (support@kentico.com)? They will be happy to help you.
As with any other software, there's always some learning curve, so it's possible that a simple advice may have helped you. Kentico CMS is used by customers in 60 countries right now, so I believe it may work for you, too.
Best Regards,
Petr Palas, Kentico Software
Interesting to see that within hours, Sitecore, then Kentico (sorry, I have no idea where they're comments went - thanks Community Server) and Umbraco have replied regarding thier packages.
In my response, I do wish Sitecore was a viable solution for me, both interms of licensing and viability of installation on a shared platform. For .NET enthusiasts, I recommend downloading Sitecore Xpress, it is true genius in a ball of XML, XSL and XAML. Checkout Alex's blog, too.
I am going to try Umbraco again. Maybe I didn't give it enough of a try. It sounds impressive, though is a bit downspec-ced.
Though I am still going to write my own, which is going really well, thanks!
Nathan, I'm doing a training right now. Last week was the DNS transfer to the new server ip address. The comment is probably on the old server, not here, because DNS take 24 hours to update.
I'll have a look if I can find anything on the old server that's gone here and see if I can post it.
Ahh so that's where my comment went.
You did check your comments review admin part I take it ?
There's one comment that I've restored now, by Petr Palas (Kentico). No Mischa comment though. It wasn't in the database.
Oh thanks, Dennis!
Sorry about your comment going, Mischa. I don't have anything in my admin area, I'm afraid.
Is there anyway I can get my comments to be emailed to me, then I won't miss anything?
Yeah, somewhere in your settings. My comments are always emailed to me.
Pingback from Link Love April | Strive Notes
Good to read that other developers have similar experiences with Silverlight as I did. Specially the confusion regarding "what should be done where" sounds familiar. Thanks for the tips as well.
If you'd rather use VS2008 to create Silverlight Projects, you could install the Silverlight SDK (I used the 2.0 Beta1 release) and the Microsoft Silverlight Tools Beta 1 for Visual STudio 2008. It will add some Silverlight options to your VS2008 installation, like project-templates and my code-editor in split-screen-mode works just fine for my Silverlight objects. I can edit my XAML and see the changes being applied "realtime". Hope this helps. Regards, Robin.
Well, sometimes the most obvious solutions is right in front of you.
What interest me here is the cool tagcloud control you have created. I like the idea on how to quickly configure your tag cloud by visually automatically gettiung your proposed tags, then reusing the cloud to remove tags that may not fit exactly to the contents of the article (I assume this is what the purpose is?)
Thanks for commenting.
That's the idea. Select from the left, remove from the right - although the first user who used it didn't figure it on their own out so some usability issues to be ironed out.
These tags are an idea I came up with that allows an e-Commerce true 360-degree content management and reporting. Say "Big Brother" is tagged with "Reality TV", "Davina Mcall", content publishers can automatically target products into certain sections of the site, users and the site can then use these to cross-sell against interest, generate reports and mount targetted eMarketing campaigns.
The Tag Cloud itself is actually a "v1" control. What I intended to do originally was create a Sitecore Custom Field Type, but due to deadlines I couldn't work round the [ridiculous] issue where you can't create server-side web controls within the Sitecore editor. The Tags are retrieved "across the wire" from a remote site, so further improvements will be made including a more AJAX feel - maybe show a loading gauge for larger clouds.
Hello Nathan,
Please be aware that querying against the database directly is unsupported. We're quite unique in the world to say so, but this approach is highly unmaintainable.
Beside of that, the most searched/bought/used products... that's all about conversion. By default conversion results are not saved in Sitecore but in an external system. Can't you use this system to retrieve the data?
Sitecore Solution Architect
Hi again Alex,
100% agree that Sitecore should not support this tactic - I would advise against it in usual circumstances.
The reason why we're using Sitecore to drive the extraction of sales/interest is due to the site hierarchy. As far as the user is concerned, the fact that they are in Bikes means that anything underneath is of interest to them. This cracks the one aspect of relevance. We have a number of web sites, with similar products, but structured according to the client/sales outlet, so Sitecore is the logical place to look for product hierarchy in the context of that site. eg. Bikes > MotoGp > James Toseland may be in Motorsport > Bikes > Manx Heros in another site.
We then use external systems (sales data, tagging of products, User-generated-content and user browsing history) to drive the impportance of products beneath the Bikes node and decide whether it should appear as a product of interest, ie. in the "top 10" based on the selected algorithm.
We do have a "Tagging" concept that will ultimately drive positioning of products within Sitecore, but we still feel the structure of Sitecore is the best way to identify relationships between product topics. I guess we could mirror the Sitecore node structure in a separate system, but this feels clunky.
Also, we see any minor revisions to v5 with v6 well on the roadmap is unlikely to pose breaking changes that we can't work around. And we would *never* write to the database!
Thanks for reading/commenting.
You wrote:
"Having tried it on the JavaScript elements of the new www.dukevideo.com site, it FLIES. I'm looking forward to seeing how Sitecore performs."
Go try it out in your recent Sitecore version. According to two of our bloggers, it should work quite well. In fact, to one of the Blogs below a comment states: "It's also *FAST*"
- usoniandream.blogspot.com/.../google-chrome.html
- vasilinenko.blogspot.com/.../google-chrome-web-browser-from-google.html
I have actually found that most my browsing today has been done in Chrome, so despite my concerns, it sits well with my overall experience. Of course, GMail doesn't have the bugs it has in IE, so one could have a cynical view on that.
Sitecore does, indeed, FLY. Only one complaint is that I get a vertical scrollbar on the browser so can't see the entire Content Editor. I do prefer the desktop interface of Sitecore, too, so I think I might need to adapt my working style, slightly.
That YouTube message is a message I frequently get. You probably have multiple gateways and or a proxy server to the internet. I ussually have to refresh a couple of times and then the video shows up.
I agree that errors of any sort on a page are frustrating. So are missing images, many of the images from your other posts are missing at least for me :)
I'm not convinced that Google Chrome should be on the list.
Thanks for the pointer, Dawn. Looks like my recent server change had more effects than I thought it would. I'll have a look and pull if necessary.
Mike, I very nearly didn't add Chrome to my list. But as I wrote the post it came out of Beta. (Most surprising as Google apps tend to sit in Beta for too long). It is also quite close in structure to Safari, so it costs little extra in terms of effort.
I think Microsoft Internet Explorer 6 is a little too old to be on that list - pretty much all Windows users have upgraded (or should upgrade!) to Microsoft Internet Explorer 7.
There are so many websites that don't render correctly in MS Internet Explorer 6... a kind of a boycott! Internet Explorer 6 compatibility is too much effort.
Nathan, for your twitter script problem, try using a try/catch block (http://go2lite.com/7). There are also useful JavaScript libraries (Prototype, YUI, Dojo, etc) as well as tools such as FireBug for FireFox.
-Brett
Thanks Nitin and Brett for your comments.
Nitin, I'd like to disregard IE 6 (it hurts not to, at times), but we do still see IE6 on a lot of client sites and we have to work with internal IT restrictions at sites. I think IE 8 will be the watershed, though, when we should be able to say enough is enough. Hopefully shouldn't be too long, now.
Thanks Brett. I will certainly investigate. I'd like to load and inject the script at the foot of my home page, too, as it causes a pause half way through page load which I do not like.
Well, here's the thing.
Most IE users won't have Javascript debugging enabled. It's not on by default, the only reason you see it is probably because you've installed Visual Studio and used IE for debugging or something similar. Most users will simply see the yellow triangle. I'm not saying errors are acceptable, just that they don't kill the experience.
It's tempting to inject a javascript error into the comments. (Most likely the page is protected, but none the less, it is amusing to think of it.)
Good post.
Interesting considering I got to this place in google reader
Might you have a "helper" class for Telerik's OA at this point? I'm hoping to simplify CRUD operations as much as possible, even using generics if possible.
Also, my understanding is that one has to create a "factory" (singleton though is all which is necessary) prior to creating scopes. This true? App_start was recommended, but unsure how to do exactly. Example?
Lastly, any thoughts on comparing NHibernate to OpenAccess? Trying to get unbiased opinion on which might be the best choice from performance, scalability, and ease-of-use standpoints.
Thanks for any assistance!
My Factory pattern does provide a helper class function, though I think you might be referring to a class that just implements CRUD operations. This is all good. I don't know about the feasibility of using Generics, though, as the OQL syntax "SELECT * FROM SiteExtent" won't be able to benefit from the Generic applied to, say, class CRUDHelper<T> - though you could always use reflection to generate the OQL syntax.
I am using a Factory pattern, but I don't think this is necassary, per se. My use of a Factory is not singleton (each "Session" generated its own Factories, to provide user-specific secured Factories), and I have found no requirement to initialise the OpenAccess Framework in App_Start or anywhere. I guess this initialisation would be of your Factory, not necassarily the Framework. If so, in a web app. Application_Start would be a good place. You'll find this in your Global.asax file. Have a look at articles.techrepublic.com.com/5100-10878_11-5771721.html about using this file, but your ApplicationStart event looks like:
protected void Application_Start(Object sender, EventArgs e) {
Application["Title"] = "Builder.com Sample";
}
My thoughts on nHibernate are that although it is a capable framework, my experience was cut short due to frustration with the "support" offered by the "community". Once again, its another Open Source project that is full of politics and certain individuals who design software around purist principles instead of real-world requirements, such as Composite Keys. I won't use it again, but I don't see why anyone else shouldn't. OpenAccess seems to be a solid product and you would benefit from having Telerik behind you for support - their support options and service is impressive and they have wide respect for their after-sales service. You're not going to rely on politics and developers in their bedroom to give you support when you need it.
For my major projects, I have chosen not to use OpenAccess at this point, largely because it isn't a natural fit with our framework. I am currently looking at Entity Framework, which is looking very sweet.
Thanks so much for your feedback. I found it very useful.
I had done some research on Microsoft's EF and came to the opinion that it is rather immature and missed the boat on several things right from the start, even after the long history of "competing" products / approaches on the market. I heard its next update could be 6-8 months away and even then, not exactly what is as helpful as the ORMs on the market.
Lastly, I read an article where the EF's developers basically stopped and made a statement of how they didn't think the EF was on the right track and that it would work as intended.
Should I be looking again at the EF in your opinion? Was I mislead?
I think when you look at EF and the politics around it you probably need to consider that an awful lot of developers who jumped on LINQ-to-SQL feel a bit jilted because MS decided to move on to EF. There is a lot of bad vibe around at the moment. I'm quite pleased that my initial trepidation regarding LINQ-to-SQL was right.
EF so far has been good to me. I have struggled setting up a 1..* relationship in the designer, but that is more because the manner the designer uses is a little odd. I'm not going to be able to immerse myself entirely within EF because despite its claims to map well to an OO environment, it requires your objects to inherit from base classes defined my MS, which I want to avoid. Therefore, my implementation isn't going to be as rich as it perhaps could be, in EF 2.0, for example which promises POCO support from all accounts. EF is looking very strong for me, particularly because it is aligned somewhat with WCF.
Check out this crib sheet to have a look at some code: www.simple-talk.com/.../entity-framework-the-cribsheet
MS' docs are also as good as usual, but can be quite abstract at times - but I guess that's the point!
Btw to add to the confusion, @shanselman (twitter.com/shanselman) was saying about nHibernate today that docs for it are spread thinly and widely, which I would agree with.
I experienced similar frustration with NH per the lack of support. I was simply trying to get started and I was disappointed in getting NO response on some boards after several days and limited ones on others.
There is definite concern there for me and you're right; with Telerik, paid support makes a huge difference. OA will likely tie well/better with the Telerik controls per having the same supplier.
Will keep the EF in mind and await the next release, kind of like I'm doing with Silverlight. A "read-only" designer for XAML apps in VS is just silly. It seems an obvious case of MS releasing a technology before they were prepared for it themselves. Now I have to purchase and maintain a separate environment, Expression XXXX, in order to build a Silverlight app? I'll just stick to ASP.NET apps in one IDE.
Excellent post mate. The past few days I've been gathering as much info I can regarding OpenAccess, nHibernate, and EF.
I'm currently reading "O'Reilly - Programming Entity Framework" which so far has provided some informative material regarding this solution. However, like most of you have stated above, I think I'll wait till EF matures a bit further before implementing it in large projects.
Telerik's OpenAccess seems to be a solid product; much like their ASP.NET Components.
There is a simple fix for this in the WCF configuration, just add this before the closing system.servicemodel tag in your config file:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://www.thebaseaddresswcfshouldlistento.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Ah, excellent, thanks a lot.
Google didn't serve me too well that time, then!
Grant's solution is excellent - that's just fixed an issue I've spent the last four hours trying to fix!
Awesome, you save me the headache
very useful,thank for shared.
Is this only UI localization or does your application also have data localization? I have experienced too much products where localization of the data was necessary but not one model seems to be "correct". So if you have such design problems and would like to share that on your blog then that would be great.
That's an interesting point. The data within the product can surely be international, and would therefore need representing according to the country of the data within the existing localised application (which may be different). I'll have a look around.
On a greenfield project you can add a locale field to your table.
If you have data stored in different stores based on locale you can get a repository factory / registry to return the correct datasource. The "correct" solution depends on what type of data and where it's stored.
Thnx.
Zak
I also found this useful, but you should know that a var is not the same as a vb variant. In fact, it has many uses, and I use it all the time. In fact there are times that you HAVE to use it other than the one you mention above. Any time an object is generated at runtime, where the type may not be know before hand, you will need to use a 'var.' Also, it is a strong-data type, in that the compiler knows and enforces type restrictions. But that type information is generated at runtime.
I had exactly the same problems, but to get around the linq problems, ended up making a serializable class that inherited from the linq to sql class and in its constructor assigned all the values from the base class.
Even with all the notes on the web, its still a difficult exercise to get all this working.
Many thanks - spot on. I had been trying to solve that for literally days!
Any chance of a download of the solution?
Yes, of course. I was meaning to get round to doing that. Need to make a few updates to the post, too. Will get on to that tonight (BST).
I have derived a similar solution.
The interface is defined as: [OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
object HelloAnonymous();
In the actual implementation, I have used the Newtonsoft serializer:
public object HelloAnonymous()
{
return Newtonsoft.Json.JavaScriptConvert.SerializeObject(new { To="You", From="Service" });
You are correct that anonymous types are better for serializing a subset of the type returned by the Entity Framework.
One other thing that I had to do was to implement JSONP callback for my services, as I host my services on a separate domain to my client (MVC2 website). This is so that the same instance can be reused by multiple clients.
My config look like this:
<service name="Ashlen.Portal.Services.TestService" behaviorConfiguration="MEX">
<endpoint address="json" binding="webHttpBinding" contract="Ashlen.Portal.Services.ITestService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
....
<serviceBehaviors>
<behavior name="MEX">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
...
<bindings>
<webHttpBinding>
<binding name="MyAuth">
<jsonpMessageEncoding/>
<security mode="None">
<transport clientCredentialType="None"/>
</security>
</binding>
</webHttpBinding>
To enable a clean solution, I am refactoring my code so that JSON is one of the many endpoints my service provides. It bugs me that I have to hardcode the serialization of the object (Newtonsoft) in the service class, as the correct procedure would be to return the anonymous type and let the endpoint take care of the serialization (ie serialiaze to string for JSON, return the object type for wsHttpBinding, etc).
Keep reading my blog for the label:WCF for updates.
thanks
Thanks. Very good soluction.
Unit Testing Entity Framework 4.0
One more solution if you want to have better code consistency is to use JavaScriptConverter which will handle circular reference dependencies and will not serialize such references.
I've blogged about here:
hellowebapps.com/.../producing-json-from-entity-framework-4-0-generated-classes
never expose your object model(s), EF classes in your case, as a type on a service. You severely tie your hands by doing this, as you saw, because you rely on the client platform being able to interpret/represent your model. Also, the client dictates changes you can make to an internal OM. AND, you have to 'dumb' down your OM to cater to a client. Instead you should be creating a second model for your service, that is simpler, to expose to a consumer. Then you translate from one model to the other. Just because javascript is the client platform doesn't mean we lose all sense of what SOA is.
Can you reput the zip file of the solution plz ?
Sorry about the delay, had some issues to sort out. The ZIP file of a VS2010 project is here:
programx.co.uk/.../TestableMockableEntityFramework4.zip
Thanks very much for your useful article.
For anyone who is looking for a clean Web.config configuration to call a web service over HTTPS with BasicHTTPBinding while sending large data such as Images, please use the below:
<system.serviceModel>
<behaviors>
<behavior name="sslBehaviour">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</serviceBehaviors>
</behaviors>
<basicHttpBinding>
<binding name="basicwithssl" maxReceivedMessageSize="100000000" sendTimeout="00:10:00" receiveTimeout="00:10:00" textEncoding="UTF-8">
<readerQuotas maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="2147483647"/>
<security mode="Transport"/>
</basicHttpBinding>
</bindings>
<services>
<service name="Service_1_0" behaviorConfiguration="sslBehaviour">
<host>
<baseAddresses>
<add baseAddress="www.example.net/.../>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicwithssl" contract="UI.IService_1_0"> </endpoint>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="false" />
</system.serviceModel>
Hello,
The RemoteCertificateValidationCallback doesn't work for Silverlight applications. I've got to figure out a way to ignore invalid certs for Development. I've tried putting code like you have in the default.aspx.cs file.
However, Silverlight doesn't support this and even though defined in the default page code, it isn't used.
@frosty: I'll have a play with this tonight. I would say that having the check on Default.aspx.cs would have no effect, as the Silverlight control is essentially independent of the underlying page (it could just be a .html page). It would need to be within the SL control.
Refactoring my code so that JSON is one of the many endpoints my service provides. It bugs me that I have to hardcode the serialization of the object (Newtonsoft) in the service class, as the correct procedure would be to return the anonymous type and let the endpoint take care of the serialization.
Many Thanx @ Grant. Saved mi demo!
Thanks, this is part of what I was looking for. I see the kendui datasource can use odata. Have you tried anything with wiring the kendoui odata operations to ria?
Hi,
Can you post the code for your application
Danish
Thanks for commenting guys.
Gene:
I have not yet played with oData, so couldn't really say. I haven't used oData only due to its poor support for security.
Danish:
Unfortunately the code presented her is an extract from a project subject to commercial property so I cannot post the actual code.