<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6687250768108187558</id><updated>2011-07-30T19:42:08.058-07:00</updated><category term='Job Centre Plus'/><category term='Asp.net MVC'/><category term='Architecture'/><category term='Screenscraping'/><category term='ListControl'/><category term='Linq'/><category term='Entity Framework'/><title type='text'>jamie jones - better by design</title><subtitle type='html'>Some thoughts and insights from a web developer, from generating leads and invoicing to more technical topics related to my work.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jamie-jones-better-by-design.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jamie jones - better by design</name><uri>http://www.blogger.com/profile/13292293729684051347</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6687250768108187558.post-7743572236394648554</id><published>2010-02-06T09:34:00.000-08:00</published><updated>2010-02-06T09:34:22.927-08:00</updated><title type='text'>Silverlight Multi File Upload control</title><content type='html'>I have been making some updates to my multisite content management system to enhance the user experience.&lt;br /&gt;I found http://slfileupload.codeplex.com/ by Michiel Post to be excellent.&lt;br /&gt;&lt;br /&gt;I found its one limitation was that I was unable to get the name of the files uploaded within the javascript event handler, that was until I made some changes to the code. I have submitted the changed to be included so hopefully you'll not need to make the changes, but until then, here they are.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Tahoma; font-size: 10pt;"&gt;I created a file  called FileUploadedEventArgs.cs&lt;br /&gt;&lt;br /&gt;namespace mpost.SilverlightMultiFileUpload.Classes&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ScriptableType]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class FileUploadedEventArgs : EventArgs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ScriptableMember()]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string FileName { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double FileSize {get; set;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public FileUploadedEventArgs(string fileName, double fileSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileName = fileName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileSize = fileSize;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and changed FileCollection.cs line 276&lt;br /&gt;SingleFileUploadFinished(this, null);&lt;br /&gt;to &lt;br /&gt;SingleFileUploadFinished(this, new FileUploadedEventArgs(file.FileName,  file.FileSize));&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Tahoma; font-size: 10pt;"&gt;An example of the javascript to access the data.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Tahoma; font-size: 10pt;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SingleFileFinished(sender, args) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(args.FileName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(args.FileSize);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Tahoma; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6687250768108187558-7743572236394648554?l=jamie-jones-better-by-design.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamie-jones-better-by-design.blogspot.com/feeds/7743572236394648554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2010/02/silverlight-multi-file-upload-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7743572236394648554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7743572236394648554'/><link rel='alternate' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2010/02/silverlight-multi-file-upload-control.html' title='Silverlight Multi File Upload control'/><author><name>jamie jones - better by design</name><uri>http://www.blogger.com/profile/13292293729684051347</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6687250768108187558.post-7867927873524532718</id><published>2010-01-22T14:33:00.000-08:00</published><updated>2010-01-22T14:41:07.504-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asp.net MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Asp.net MVC with Entity Framework Architecture</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As I have a strong interest in software architecture I will be giving an overview of the architecture I have used to create my multisite content management system, which will be open to your suggestions for improvement. I have aimed to create a loosely coupled – highly coherent architecture to keep the application maintainable and as extensible as possible as I plan to add new features as an when they are needed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Technologies used&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unity application block for dependency injection &lt;/li&gt;&lt;li&gt;Asp.net MVC &lt;/li&gt;&lt;li&gt;Entity Framework &lt;/li&gt;&lt;li&gt;JQuery &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Architecture&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The architecture consist of a Repository layer a Services layer and Asp.net MVC for the presentation.&lt;br /&gt;&lt;br /&gt;The repository layer is responsible for getting objects in and out of the datastore which are to be used by the service layer. The service layer is responsible for applying the business rules and providing the presentation with required services.&lt;br /&gt;&lt;br /&gt;I have tried to show the basic overview below. I will go in to more detail a bit later on, but basically the services for example have a reference to the IGalleryRepository and Unity takes care of creating a new instance of the EntityFrameworkGalleryRepository.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Hn4HnSGHsXU/S1mhEntV8xI/AAAAAAAAAA4/2fmJpHKMp8w/s1600-h/image001.gif"&gt;&lt;img src="http://3.bp.blogspot.com/_Hn4HnSGHsXU/S1mhEntV8xI/AAAAAAAAAA4/2fmJpHKMp8w/s400/image001.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To keep the Entities generated by the Entity Framework out of the rest of my application and keep the dependency on the Entity Framework contained to the EntityFrameworkRepository that implements the repository interface, the entities are mapped to POCOs. This will enable me to switch to Linq-Sql or some other data storage strategy will a lot less hassle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;public TextContentRepository.Concrete.TextContent GetTextContent(int textContentId, Guid applicationId)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; using (entities = GetContext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JJCore.TextContent textContent = entities.TextContent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Include("ApplicationPage")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .FirstOrDefault(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t =&amp;gt; t.TextContentId&amp;nbsp;&amp;nbsp; == textContentId&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.ApplicationPage.Application.Id ==&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; applicationId);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JJRepositories.TextContentRepository.Concrete.TextContent toReturn =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&amp;nbsp; JJRepositories.TextContentRepository.Concrete.TextContent(textContent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return toReturn;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Above is an example of using the entity framework while keeping the rest of the application isolated from it.&lt;br /&gt;&lt;br /&gt;I have created a POCO with a constructor that takes the entity as an argument but I will be improving this by creating a Mapper class, by using &lt;a href="http://www.codeplex.com/AutoMapper"&gt;AutoMapper&lt;/a&gt; or by switching to Entity Framework 4 to make use of &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2009/07/11/entity-framework-4-0-how-to-use-pocos.aspx"&gt;POCOs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would also like to remove the magic string for the includes in the near future too. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;[AcceptVerbs(HttpVerbs.Post)]&lt;br /&gt;public ActionResult Edit(Application application)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.Validate(ModelState);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ModelState.IsValid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View(application);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; applicationService.SaveApplication(application);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return RedirectTo&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Action("Index");&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The above is an Action on the SitesController. It has one specific responsibility.&lt;br /&gt;Pass the application to be saved if it is valid.&lt;br /&gt;&lt;br /&gt;I have not gone in to much detail on the MVC part of the implementation, I'll save that for another post. I have ensured that I am always programming to interfaces to allow for easier unit tests (another post) and dependency injection.&lt;br /&gt;I hope I managed to describe the architecture and I welcome you comments and suggestions for improvement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6687250768108187558-7867927873524532718?l=jamie-jones-better-by-design.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamie-jones-better-by-design.blogspot.com/feeds/7867927873524532718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2010/01/aspnet-mvc-with-entity-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7867927873524532718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7867927873524532718'/><link rel='alternate' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2010/01/aspnet-mvc-with-entity-framework.html' title='Asp.net MVC with Entity Framework Architecture'/><author><name>jamie jones - better by design</name><uri>http://www.blogger.com/profile/13292293729684051347</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Hn4HnSGHsXU/S1mhEntV8xI/AAAAAAAAAA4/2fmJpHKMp8w/s72-c/image001.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6687250768108187558.post-7850630744887857648</id><published>2009-11-23T09:22:00.000-08:00</published><updated>2009-11-23T09:25:06.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><category scheme='http://www.blogger.com/atom/ns#' term='ListControl'/><title type='text'>Use Linq to get selected Items on a ListControl</title><content type='html'>Very quick post, if you would like to get all ListItems from a ListControl where Selected == true you can do this with Linq.&lt;br /&gt;&lt;br /&gt;lcListControl.Items.Cast&lt;ListItem&gt;().Where(i =&gt; i.Selected)&lt;br /&gt;&lt;br /&gt;you can even just get the selected values&lt;br /&gt;&lt;br /&gt;clRoomTypeNights.Items.Cast&lt;ListItem&gt;().Where(i =&gt; i.Selected).select(li =&gt; li.Value)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6687250768108187558-7850630744887857648?l=jamie-jones-better-by-design.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamie-jones-better-by-design.blogspot.com/feeds/7850630744887857648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2009/11/use-linq-to-get-selected-items-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7850630744887857648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7850630744887857648'/><link rel='alternate' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2009/11/use-linq-to-get-selected-items-on.html' title='Use Linq to get selected Items on a ListControl'/><author><name>jamie jones - better by design</name><uri>http://www.blogger.com/profile/13292293729684051347</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6687250768108187558.post-7443178323651158399</id><published>2009-11-02T12:28:00.000-08:00</published><updated>2009-11-15T09:53:23.213-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Job Centre Plus'/><category scheme='http://www.blogger.com/atom/ns#' term='Screenscraping'/><title type='text'>Screen scraping Job Centre Plus</title><content type='html'>You would have thought the government would be doing everything they can to get people in to work, wouldn't you?&lt;br /&gt;&lt;br /&gt;I am working on a project which requires local job centres and job to be displayed to the user. No problem I thought, I'll just head over to the Job Centre Plus website and find out about the API they offer, or in this case don't.&lt;br /&gt;&lt;br /&gt;It seems the only way I was going to do this is to screen scrape for the information I require, which it turns out wasn't as difficult as it sounds. Getting the local job centres was quiet easy, just make a request to the correct url with some post variables and hey presto I got the result I required, searching for jobs was not that simple, more on this later.&lt;br /&gt;&lt;br /&gt;string url = "http://www.jobcentreplus.gov.uk/JCP/Aboutus/Ouroffices/Search/LocalOfficeSearch.aspx";&lt;br /&gt;&lt;br /&gt;Dictionary&lt;string, string&gt; postVariables = new Dictionary&lt;string, string&gt;();&lt;br /&gt;postVariables.Add("Action","SearchOffices");&lt;br /&gt;postVariables.Add("Type", "0");&lt;br /&gt;postVariables.Add("TypeName", "");&lt;br /&gt;postVariables.Add("OfficeSearchCriteria", postcode);&lt;br /&gt;postVariables.Add("BeginSearch", "Find+Office");&lt;br /&gt;&lt;br /&gt;With the result from this request I started to use Regex to find the data I needed, as the result was not valid Xhtml I couldn't just parse the xml as I had planned. I stumbled on the HtmlAgilityPack (http://htmlagilitypack.codeplex.com/) and with a little XPath the job was a good un'.&lt;br /&gt;&lt;br /&gt;Searching for the jobs was a different kettle of fish, for a start it seems to require a sessionId in the query string which makes sending a link to the job to someone else quiet difficult and makes my job a little harder.&lt;br /&gt;&lt;br /&gt;I first had to make a request to the search page to take the viewstate data and edit it to match the terms I wished to search for and then make a request to the result page.&lt;br /&gt;&lt;br /&gt;string post = string.Format("__VIEWSTATE{0}&amp;__EVENTTARGET=uctlHCCDialogue%3AbtnSearch&amp;uctlHCCDialogue%3AtxtUserInput=all+jobs+in+{1}&amp;uctlHCCDialogue%3AbtnSearch=Search", viewState, postcode.Replace(" ", "+"));&lt;br /&gt;&lt;br /&gt;Regex exp = new Regex( @"\?sessionId=[0-9a-zA-Z-]*&amp;amp;pid=[0-9]*", RegexOptions.IgnoreCase);&lt;br /&gt;&lt;br /&gt;I've still got work to do, I need to be able to make a request after the session has expired, this needs to be seamless to the user.&lt;br /&gt;&lt;br /&gt;Check back soon for an update and check my website for more information on the project or if you require development work &lt;a href="http://jamie-jones.co.uk"&gt;jamie jones freelance web developer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6687250768108187558-7443178323651158399?l=jamie-jones-better-by-design.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamie-jones-better-by-design.blogspot.com/feeds/7443178323651158399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2009/11/screenscraping-job-centre-plus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7443178323651158399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6687250768108187558/posts/default/7443178323651158399'/><link rel='alternate' type='text/html' href='http://jamie-jones-better-by-design.blogspot.com/2009/11/screenscraping-job-centre-plus.html' title='Screen scraping Job Centre Plus'/><author><name>jamie jones - better by design</name><uri>http://www.blogger.com/profile/13292293729684051347</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
