01 March 2010 - 11:50 PM / by Dominic Pettifer. 2 Comments for Dependency Injection in ASP.NET MVC 2 – Part 2: ModelBinders/ViewModels.
Technical Article - In part 2 of a series on Dependency Injection in ASP.NET MVC, we look at injecting dependencies into your ViewModels. This technique comes in useful for when you want to render a dropdown list of items from a database, and don’t want your controller populating the items.
Part 1 covered the ins and outs of Dependency Injection and IOC Containers in general, so check out that article for an overview. In part 2 we look to use the Castle Windsor IOC Container to inject dependencies into our ViewModels by using a custom ModelBinder. But why?
It's common to use custom ViewModels for each view in your ASP.NET MVC application, rather than send in a domain object. You create a ViewModel with properties tailored to the needs of the view. This has maintainability, type safety, and security benefits, especially when using a ViewModel to represent a web-form for POSTing data back to the server. Consider the following ProductForm ViewModel:
public class ProductForm
{
[Required]
public string ProductName { get; set; }
public string Description { get; set; }
[Required]
public string Price { get; set; }
[Required]
public string Quantity { get; set; }
[Required]
public int? ParentCategoryId { get; set; }
public IList<Category> Categories { get; set; }
}In our strongly typed aspx view we use the 'Categories' property to fill in a drop down list of Categories for the user to select a parent Category for the Product (which is then assigned to the ParentCategoryId property on post-back). The Categories collection will need to be filled in though, via our Controller:
public class ProductsController : Controller
{
protected ICategoryRepository CategoryRepository = null;
public ProductsController(ICategoryRepository categoryRepository)
{
this.CategoryRepository = categoryRepository;
}
[HttpGet]
public ActionResult Add()
{
IList<Category> categories = CategoryRepository.ListAllCategories();
ProductForm form = new ProductForm();
form.Categories = new List<Category>();
foreach (Category category in categories)
{
form.Categories.Add(category);
}
return View(form);
}
[HttpPost]
public ActionResult Add(ProductForm form)
{
if (!ModelState.IsValid)
{
IList<Category> categories = CategoryRepository.ListAllCategories();
form.Categories = new List<Category>();
foreach (Category category in categories)
{
form.Categories.Add(category);
}
return View(form);
}
Product product = new Product();
product.Name = form.ProductName;
product.Description = form.Description;
// ...fill out other properties and persist to database (snip)... //
return RedirectToAction("Edit");
}
}All well and good except we're always having to manually populate the ViewModel's Categories collection, including when model validation fails after POSTing and we have to re-display the View. This can get tedious having to type this each time we want to use the ProductForm, and violates the DRY (Don't Repeat Yourself) principle. We could encapsulate the Category population code in a method, or we could get the ViewModel itself to take care of it. Simply pass in the ICategoryRepository into the ProductForm constructor:
ProductForm form = new ProductForm(CategoryRepository);
...and change the ProductForm class constructor to the following:
public class ProductForm
{
public ProductForm(ICategoryRepository categoryRepository)
{
this.Categories = new List<Category>();
foreach (Category category in categoryRepository.ListAllCategories())
{
this.Categories.Add(category);
}
}
// ...other properties (snip)... //
public IList<Category> Categories { get; set; }
}...and the Controller code becomes a lot simpler:
public class ProductsController : Controller
{
protected ICategoryRepository CategoryRepository = null;
public ProductsController(ICategoryRepository categoryRepository)
{
this.CategoryRepository = categoryRepository;
}
[HttpGet]
public ActionResult Add()
{
return View(new ProductForm(CategoryRepository));
}
[HttpPost]
public ActionResult Add(ProductForm form)
{
if (!ModelState.IsValid)
{
return View(form);
}
Product product = new Product();
product.Name = form.ProductName;
product.Description = form.Description;
// ...fill out other properties and persist to database (snip)... //
return RedirectToAction("Edit");
}
}Except now we have a problem, the above code will throw an error as soon as we try to submit (POST) a Product.
ASP.NET MVC's DefaultModelBinder is responsible for magically taking your form's input parameters and setting them against the properties of your ProductForm object passed into the Add() method above. However, the DefaultModelBinder doesn't know about our IOC Container, and it expects there to be a default no-arg constructor in our ViewModel which is now missing. What we need to do create our own IocModelBinder that overrides the DefaultModelBinder to support constructor injection.
public class IocModelBinder<T> : DefaultModelBinder
{
public IocModelBinder()
{
Type bindedType = typeof(T);
var modelTypes = from t in AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
where bindedType.IsAssignableFrom(t)
select t;
foreach (Type type in modelTypes)
{
IocHelper.Container().AddComponentLifeStyle(type.FullName,
type, LifestyleType.Transient);
}
}
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
{
return IocHelper.Container().Resolve(modelType);
}
}There are other steps required to hook up the Castle Windsor IOC Container which are covered in part 1, including the implementation for the IocHelper class, and an explanation of what the constructor is doing. We're basically overriding the CreateModel method which does the actual 'new'ing up of the ViewModel object on binding.
To save having to add each ViewModel to the IOC Container's .xml configuration, just make sure your ViewModels extend a base class:
public class ProductForm : ViewModelBase { }Then register the IocModelBinder in the Global.asax.cs file:
public class MvcApplication : System.Web.HttpApplication
{
// ...route registration code (snip)... //
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new IocControllerFactory());
ModelBinders.Binders.DefaultBinder = new IocModelBinder<ViewModelBase>();
}
}We now have another problem, because of the way we've set the DefaultBinder to IocModelBinder<ViewModelBase>(); we're now only able to bind types that derive from ViewModelBase, trying to bind any other type results in an exception. We could keep ASP.NET MVC's DefaultModelBinder and just add the IocModelBinder to the Binders collection, but we can't use base classes with this approach so we end up with something like the following:
ModelBinders.Binders.Add(typeof(ProductForm), new IocModelBinder<ProductForm>()); ModelBinders.Binders.Add(typeof(CategoryForm), new IocModelBinder<CategoryForm>()); ModelBinders.Binders.Add(typeof(CustomerForm), new IocModelBinder<CustomerForm>()); ModelBinders.Binders.Add(typeof(ProductsView), new IocModelBinder<ProductsView>()); ModelBinders.Binders.Add(typeof(CustomerOrderView), new IocModelBinder<CustomerOrderView>()); // ...long list of ViewModel types (snip)... //
It's just a shame we can't do this:
ModelBinders.Binders.Add(typeof(ViewModelBase), new IocModelBinder<ViewModelBase>());
What we want is a way to add IocModelBinder just once for a base class, while still keeping DefaultModelBinder to default back to. Jeffrey Palermo introduced the concept a SmartModelBinder in his book ASP.NET MVC In Action (Manning). A SmartModelBinder stores a collection of ModelBinders and chooses which one to use based on the type, it can even allow using a base class.
public class SmartModelBinder : DefaultModelBinder
{
private readonly IFilteredModelBinder[] _filteredModelBinders;
public SmartModelBinder(params IFilteredModelBinder[] filteredModelBinders)
{
_filteredModelBinders = filteredModelBinders;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
foreach (IFilteredModelBinder modelBinder in _filteredModelBinders)
{
if (modelBinder.IsMatch(bindingContext.ModelType))
{
return modelBinder.BindModel(controllerContext, bindingContext);
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
public interface IFilteredModelBinder : IModelBinder
{
bool IsMatch(Type modelType);
}We need to modify our IocModelBinder slightly to implement the IFilteredModelBinder interface:
public class IocModelBinder<T> : DefaultModelBinder, IFilteredModelBinder
{
// ...constructor and CreateModel override (snip)... //
public bool IsMatch(Type modelType)
{
return typeof(T).IsAssignableFrom(modelType);
}
}We then register it in our Global.asax.cs like so:
ModelBinders.Binders.DefaultBinder = new SmartModelBinder
(
new IocModelBinder<ViewModelBase>(),
new IocModelBinder<SomeOtherBaseType>(),
new SomeOtherModelBinder<SomeType>()
);Not everyone will like the idea of making the ViewModel class responsible for data access, they would argue the ViewModels should remain as simple POCOs free of any logic, and that it could be breaking the Single Resposibility Principle. I can understand where they're coming from. However, I do like the approach as it keeps the ViewModel class completely self contained, decoupled, and still allows unit testing, so long as the technique isn't abused. I would personally only recommend injecting database dependencies (Repositories) into ViewModels for filling out form input elements such as drop down lists, lists of check boxes etc.
Great article.
Can this be used for multiple parameters, i.e passing in more than one parameter in constructor?
Also do you know how it might work using StructureMap?
Many Thanks
Posted on 29 November 2010 - 3:41 PM / by Matthew Mitchell
and her ugg bailey button mother went cheap uggs
Posted on 15 October 2011 - 4:24 AM / by ugg uk
Thanks for sharing with us greatest materials which can help students with academic writing.
Posted on 25 January 2012 - 4:53 PM / by research paper services
Great stuff, nice to find something like this!
Posted on 25 January 2012 - 4:56 PM / by buy custom essays
the right have to <strong><a href="http://www.jordanshoesspacejam.com/" title="cheap jordans shoes">cheap jordans shoes</a></strong> draw a <strong><a href="http://www.jordanshoesspacejam.com/air-jordan-6-rings-c-30.html" title="new jordan 6 rings">new jordan 6 rings</a></strong> <strong><a href="http://www.jordanshoesspacejam.com/air-jordan-6-rings-c-30.html" title="cheap jordan 6 rings">cheap jordan 6 rings</a></strong> circle, <strong><a href="http://www.jordanshoesspacejam.com/kid-jordan-shoes-c-33.html" title="kid jordans for cheap">kid jordans for cheap</a></strong> the <strong><a href="http://www.jordanshoesspacejam.com/air-jordan-6-rings-c-30.html" title="jordan 6 rings shoes">jordan 6 rings shoes</a></strong> <strong><a href="http://www.jordanshoesspacejam.com/kid-jordan-shoes-c-33.html" title="cheap kid jordan shoes">cheap kid jordan shoes</a></strong> number is <strong><a href="http://www.jordanshoesspacejam.com/air-jordan-6-rings-c-30.html" title="jordan six ring">jordan six ring</a></strong> odd in the dance the dance, such as opera. Broken Bridge The husband s...
Posted on 16 November 2011 - 2:11 AM / by jordans basketball shoes
<strong><a href=http://www.airjordansstore.net/air-jordan-retro-12-c-16.html title="Jordan Retro 12">Jordan Retro 12</a></strong> unt <strong><a href=http://www.airjordansstore.net/ >Authentic Jordan Shoes</a></strong>of each fine and <strong><a href=http://www.airjordansstore.net/air-jordan-retro-20-c-39.html title="Jordan 20">Jordan 20</a></strong> was imprisoned for two days. </P> <p> he complained that dog feces equipment provided <strong><a href=http://www.airjordansstore.net/air-jordan-retro-15-c-40.html title="air jordan 15">air jordan 15</a></strong> by the authorities of the paper is too small, <strong><a href=http://www.airjordansstore.net/air-jordan-retro-15-c-40.html title="jordan 15">jordan 15</a></strong> he needs <strong><a href=http://www.airjordansstore.net/ >Authentic Jordan Shoes</a></strong>like shopping bags as big <strong><a href=http://www.airjordansstore.net/air-jordan-retro-20-c-39.html title="Jordan Retro 20">Jordan Retro 20</a></strong> as the ba...
Posted on 20 December 2011 - 5:44 AM / by Jordan Retros
nice post,i like it very much,but i think u can think it in another way then,cause it will be interesting
Posted on 30 December 2011 - 6:03 AM / by Screen printed t shirts
Very interesting topic and useful post. It really help me. THANK YOU!!!
Posted on 19 January 2012 - 7:38 AM / by london marketing internship
o Chen and his partner. </P> <p> 12 月 <b><a href="http://www.canadagoosejackets.com.co/">canada goose jacket sale</a></b> <b><a href="http://www.canadagoosejackets.com.co/">canada goose jacket</a></b> 7 日 14 时 31 points, Lawrence Sina <b><a href="http://www.canadagoosejackets.com.co/">canadian goose jacket</a></b> microblogging users...
Posted on 29 January 2012 - 2:06 AM / by cheap jordan shoes
Thanks for the article.
Why not simply pass in the relevant properties into the viewmodel instead of the repository
[HttpGet]
public ActionResult Add()
{
var viewModel = new ProductForm(Category.Repository.ToList());
return View(viewModel);
}
Posted on 4 October 2010 - 6:02 AM / by Sam
The reason you can't pass the repository into the class is because MVC is creating the class for you on POSTing the form:
[HttpPost]
public ActionResult Add(ProductForm form)
{
//do stuff here with the form
}
Posted on 11 May 2011 - 12:11 AM / by Adam Tegen
If you need to re-inflate your ViewModel you can do it in your post method the same way Sam is suggesting you do it in the get. Just re-inflate before returning the view. Seems like a lot of extra work and indirection for little gain the way you are proposing.
Posted on 12 August 2011 - 2:30 PM / by Justin Stuparitz
The "Single Responsibility Principle" is important but we must try to ease our work and make it more stable. Everyone should be aware that Abusing the ViewModel class can cause a lot of problems and nerves, but it`s interesting how this technique manages to perform all these operations without any problems.
Posted on 29 September 2011 - 3:27 PM / by small business logo design
[url=http://www.nikeam.com]nike air max 2011[/url]
[url=http://www.nikeam.com]nike air max 2010[/url]
Posted on 26 May 2011 - 9:45 AM / by nike air max 2011
People operating and actively playing ball over a standard schedule should choose which shoe they would choose to go to purchase. Nike air max 95 possess a reputation of producing high-quality and good looking shoes. The terrific sneaker developed by Nike air max 2011 institution deserve getting recommended, using the sports activities items is excellent to some. operating shoes should have particular attributes if they are regarded as getting good.
Posted on 17 August 2011 - 3:41 AM / by air max 90
A great amount Moncler of colors would take many responses to chance seekers. Charcoal what is moreNorth Face Women to darker grey are mostly symbolic representation associated withMoncler Coats maturation. Purple, common as well as random world are token with youthful ones. For that cause different identification can conveniently elect a considerable amount of shades.
Posted on 14 December 2011 - 6:18 AM / by Moncler
[url=http://www.usjordan6.com/air-jordan-retro-10-C41.html]jordan 10 for sale[/url] [url=http://www.usjordan6.com/]jordan retro 6[/url] e students in the [url=http://www.usjordan6.com/air-jordan-retro-11-C42.html]jordan 11 space jams[/url] [url=http://www.usjordan6.com/]jordan 6 rings[/url] room playing with a glove. [url=http://www.usjordan6.com/air-jordan-retro-10-C41.html]jordan 10 retro[/url] However, a few teachers in [url=http://www.usjordan6.com/air-jordan-retro-11-C42.html]space jam jordans 11[/url] the office, reporters hav...
Posted on 29 January 2012 - 2:23 AM / by jordan 6
understand where a defender does not work, and now many people are suspicious of his height will limit his development, so that he could not <a href="http://www.nikejordanoutlet.net/" title="air jordan on sale">air jordan on sale</a> reach the height of JORDAN, let us see how to break this question IVERSON it! E --- --- enemy (NBAs enemies) that he has <a href="http://www.nikejordanoutlet.net/air-jordan-retro-8-C39.html" title="Cheap Jordan 8">Cheap Jordan 8</a> been known as the NBAs enemies STERN few years later he became the NBA one of the biggest cash cow. F ------ friend (friend) he has many friends, but but so are many of the allegations ...
Posted on 28 May 2011 - 2:30 AM / by Jordan Shoes
ugg uk ugg boots outlet luding cheap ugg boots ugg boots sale uk contributions ugg boots sale and ugg australia donations) cheap ugg boots for sale and the ugg boots clearance uggs outlet cheap uggs audit ugg uk of all ugg boots expenditures ugg australia ugg australia in the online public. ugg boots uk Procu...
Posted on 16 November 2011 - 6:42 AM / by ugg boots clearance
and finally <b><a href="http://www.usjordanreleasedates2011.com/air-jordan-retro-9-C40.html">Jordan 9 shoes</a></b> <b><a href="http://www.usjordanreleasedates2011.com/jordan-1-flight-C72.html">Jordan 1 flight shoes</a></b> have a <b><a href="http://www.usjordanreleasedates2011.com/">air jordan 2011</a></b> stable source of income. </P> <b><a href="http://www.usjordanreleasedates2011.com/air-jordan-retro-10-C41.html">nike Jordan 10</a></b> <p> although life is <b><a href="http://www.usjordanreleasedates2011.com/air-jordan-retro-4-C35.html">buy Jordan 4</a></b> really hard, but <b><a href="http://www.usjordanreleasedates2011.com/">jordan release dates 2011</a></b> Lin Fang b...
Posted on 16 November 2011 - 9:00 AM / by cheap gucci
Newest styles of <a href="http://www.christianlouboutinreplicacl.com/"><strong>christian louboutin high heels</strong></a> in hot sale now, <a href="http://www.christianlouboutinreplicacl.com/"><strong>Christian Louboutin Knockoffs</strong></a> shoes sale now, buy <a href="http://www.christianlouboutinreplicacl.com/"><strong>christian louboutin replica</strong></a> in our online uk store .your shoes sales prices will save.
Posted on 22 September 2011 - 2:29 AM / by christian louboutin replica
<b><a href="http://www.sneakersjordan.net/air-jordan-retro-9-C40.html">jordan 9</a></b> ghter, and he decided to <b><a href="http://www.sneakersjordan.net/air-jordan-retro-8-C39.html">cheap jordan 8</a></b> travel around the countrys major <b><a href="http://www.sneakersjordan.net/air-jordan-retro-9-C40.html">air jordans 9</a></b> cities <b><a href="http://www.sneakersjordan.net/">cheap jordan shoes</a></b> sell paintings. <b><a href="http://www.sneakersjordan.net/air-jordan-retro-9-C40.html">air jordan 9 retro</a></b> </P> <p> increas...
Posted on 15 October 2011 - 3:11 AM / by ugg boots clearance
<b><a href="http://www.buyuggbootsforcheap.com/ugg-classic-mini-C6.html">ugg classic mini sale</a></b> ear, <b><a href=""></a></b> <b><a href="http://www.uggclassic-tallboots.com">cheap ugg boots</a></b> everyone <b><a href="http://www.uggbootsclearancefreeshipping.com/">ugg sale</a></b> <b><a href="http://www.uggclassic-tallboots.com">ugg boots classic</a></b> is <b><a href="http://www.uggbootscheapsales.com/">ugg sale uk</a></b>
Posted on 15 October 2011 - 4:29 AM / by ugg bailey button
uggs clearance rl
ugg australia sale uk ugg australia sale uk
ugg boots uk night became ugg australia sale uk ugg boots uk an ugg boots outlet orphan
cheap ugg boots 2003 uggs outlet stores August, ugg boots outlet more than ugg boots sale uk ugg boots sale Yao ugg boots sale uk Nanlan with the murder occ... cheap uggs for sale ugg boots sale
Posted on 16 November 2011 - 8:03 AM / by ugg boots clearance
<b><a href="http://www.urcheapuggboots.com/">uggs</a></b> <b><a href="http://www.uggaustraliasaleuka.com/">ugg australia</a></b> und, these <b><a href="http://www.uggbootsoutletcoupon.com/">ugg uk</a></b> funds <b><a href="http://www.euggbootssaleuk.com/">ugg boots sale uk</a></b> must be used <b><a href="http://www.echeapuggboots.org/">cheap ugg boots</a></b> <b><a href="http://www.uruggbootsuk.com/">ugg boots uk</a></b> for other <b><a href="http://www.usauggbootsoutlet.net/">ugg boots outlet</a></b> purposes, not for <b><a href="http://www.euggbootsclearance.com/">ugg clearance</a></b> acute aplastic <b><a href="http://www.echeapuggboots.org/">cheap ugg boots for sale</a></b> anemia <b><a href="http://www.uggaustraliasaleuks.com/">ugg australia</a></b> <b><a href="http://www.uggaustralia-ukshop.co.uk/">ugg uk</a></b> relief, so <b><a href="http://www.uggboot-baileybutton.co.uk/">ugg boots uk</a></b> <b><a href="http://www.uggbaileybutton.me.uk/">ugg boots sale</a></b> <b><a href="http://www.uggaustraliaboots.org.uk/">ugg australia</a></b> the Su... <b><a href="http://www.euggsoutlet.org/">uggs outlet online</a></b>
Posted on 16 November 2011 - 1:31 AM / by ugg boots clearance
estival, I presented her a bouquet of her favorite white roses, as <strong><a href="http://www.nikefreeskorun.com/nike-free-50-dame-c-4.html" title="Nike Free Udsalg">Nike Free Udsalg</a></strong> the hands of <strong><a href="http://www.nikefreeskorun.com/nike-free-50-m%C3%A6nd-c-2.html" title="Nike Free 5.0">Nike Free 5.0</a></strong> <strong><a href="http://www.nikefreeskorun.com/nike-air-max-2011-m%C3%A6nd-c-13.html" title="Nike Air Max 2011">Nike Air Max 2011</a></strong> my grief. <strong><a href="http://www.nikefreeskorun.com/" title="Nike Free Sko">Nike Free Sko</a></strong> </P> <strong><a href="http://www.nikefreeskorun.com/nike-free-30-dame-c-3.html" title="Billig Nike Free">Billig Nike Free</a></strong> <br> <strong><a href="http://www.nikefreeskorun.com/nike-free-70-dame-c-5.html" title="Nike Free Run sko">Nike Free Run sko</a></strong> <P> festival in m... <strong><a href="http://www.nikefreeskorun.com/nike-free-30-dame-c-3.html" title="Nike Free 3.0">Nike Free 3.0</a></strong>
Posted on 16 November 2011 - 2:54 AM / by Nike Free Run
ress of the times too fast, I just learned two decades, since the vast social changes, my original work is not easy to adapt to the new situation demands, so turn the industry, this is the last three decades, I have another change occupational reasons. twenties today look back twenty years since the development of Chinese literature, the problem is really too much. I was taught this in college, taught two years and now take it for a long time various changes in terms of compression to less than an hour, just talking about only a rough impression, so there will be a lot of lack of place. Now, we have a lot of the new country, my time was in ○ annual, and in 1923 to Beijing. Before that, I became a soldier five years, was <a href="http://www.nikefreerun3.org" title="Nike Free Run"><strong>Nike Free Run</strong></a> seen after the writing of my close relationship. During this time, it is said the history of modern Chinas most chaotic, corrupt warlords, the warlords from small local warlords as well as Beijings biggest up and fall, I have a clearer impression. arrived in Beijing, I do not know even the punctuation. I was the pursuit of ideals, is made to the May Fourth <a href="http://www.nikefreerun3.org" title="Nike Free"><em>Nike Free</em></a> Movement of literary revolutionary ideals. I am sure this literary ideal contribution to the country. On the one hand <a href="http://www.nikefreerun3.org" title="Nike Sko"><em>Nike Sko</em></a> more or less by the impact of nineteenth-century Russian novel. To Beijing, I live in a small hall, mainly having to spend money. While in the military to develop a good habit, that is, no food the whole do not care. This is not easy, because any time in the ideal to the injured. But I in the army for a long time, because this study was never frustrated. This is then moved into the vicinity of Peking University, soon to be commended because many friends. Beijing winter is minus ten degrees, the minimum to minus twenty degrees, I wore a thin unlined, where to stay in a. Others is...
Posted on 5 December 2011 - 8:01 AM / by nike free run
and [url=http://www.nikefreerun3.org]Nike Free[/url] on the top item on the wolf, because my hand was not very hard, and the wolf off [url=http://www.nikefreerun3.org]Nike Sko[/url] the gas, which [url=http://www.nikefreerun3.org]Nike Free Run[/url] is a transgressio...
Posted on 9 December 2011 - 7:42 AM / by nike free run
<b><a href="http://www.ourpradabags.com" title="prada outlet">prada outlet</a></b> founder Mario · <b><a href="http://www.ourpradabags.com/" title="prada australia">prada australia</a></b> (Mario <b><a href="http://www.ourpradabags.com" title="Prada UK">Prada UK</a></b>) the design of fashionable.Series of <b><a href="http://www.ourpradabags.com/Prada-Leather-Handbags" title="prada messenger bags">prada messenger bags</a></b> products,Today, <b><a href="http://www.ourpradabags.com" title="Prada Bags for sale">Prada Bags for sale</a></b> still very exciting and <b><a href="http://www.ourpradabags.com/" title="Prada Sale">Prada Sale</a></b> with the social high reputation, <b><a href="http://www.ourpradabags.com" title="Prada On Sale">Prada On Sale</a></b> product in the special enjoyment.<b><a href="http://www.ourpradabags.com" title="replica prada bags">replica prada bags</a></b> became popular in the world, <b><a href="http://www.ourpradabags.com" title="Prada Handbags Sale">Prada Handbags Sale</a></b> bag. But very few people know, <b><a href="http://www.ourpradabags.com" title="prada purses">prada purses</a></b>.great quality products <b><a href="http://www.ourpradabags.com" title="prada wallet">prada wallet</a></b>, which is why put on <b><a href="http://www.ourpradabags.com/Prada-Shoes" title="Cheap Prada Shoes">Cheap Prada Shoes</a></b> will feel comfortable very reason. Although emphasize <b><a href="http://www.ourpradabags.com/Prada-Leather-Handbags" title="Prada Tote Bags">Prada Tote Bags</a></b> pay special attention to after-sales service, with <b><a href="http://www.ourpradabags.com" title="Prada Sneakers">Prada Sneakers</a></b>,still pay attention to <b><a href="http://www.ourpradabags.com" title="cheap prada">cheap prada</a></b> brand.
Posted on 7 December 2011 - 9:28 AM / by prada outlet
<b><a href=http://www.usjordan6.com/air-jordan-retro-12-C43.html>retro jordan 12</a></b> in This is <b><a href=http://www.usjordan6.com/>jordan 6 rings</a></b> especially in the Dakar <b><a href=http://www.usjordan6.com/air-jordan-retro-12-C43.html>jordan 12 sale</a></b> Rally staggering, conducted <b><a href=http://www.usjordan6.com/air-jordan-retro-12-C43.html>cheap jordans 12</a></b> <b><a href=http://www.usjordan6.com/>jordan retro 6</a></b> over 30 <b><a href=http://www.usjordan6.com/air-jordan-retro-12-C43.html>jordan 12</a></b> to the sessi.
Posted on 29 January 2012 - 2:51 AM / by jordan 6
Bond reveals a more human side to his character. (from the blog It’s Bond, But Not as You Know it )
And YouTube still auto-fucking-plays videos!! This is TWO-THOUSAND-AND-FUCKING-TWELVE FFS!!!
about 20 hours ago from webOn a side-note, YouTube's commenting system is god-awful atrocious dreadful horrible horrible horrible!! Constant meaningless error messages
about 20 hours ago from webJavaScript is slow mmmkay http://t.co/NbB4eQjw - Actually, no, it's not http://t.co/kpGEIoPO #nodejs
about 20 hours ago from webTFS: It's super expensive, so it must be brilliant, right? Like Sharepoint #tekpubtfstitlesuggestion
5:22 PM February 3rd from web