[{"data":1,"prerenderedAt":1015},["ShallowReactive",2],{"blog:2007:observations-on-microsoft-mvc-for-aspnet":3,"blogMore-Development":752,"comments-observations-on-microsoft-mvc-for-aspnet":765},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"tags":12,"excerpt":16,"body":31,"_type":742,"_id":743,"_source":744,"_file":745,"_stem":746,"_extension":747,"url":748,"wordCount":749,"minutes":750,"commentCount":751},"/blog/2007/observations-on-microsoft-mvc-for-aspnet","2007",false,"en","Observations on Microsoft MVC for ASP.NET","Anyone who’s tried to develop large complex web sites with ASP.NET has likely run into many problems covering the page and control life cycle, view state and post backs and subsequent maintainability including the difficulty in creating automated unit tests.","2007-10-09T14:55:04+00:00","Development",[13,14,15],".NET","ASP.NET","ALT.NET",{"type":17,"children":18},"root",[19,26],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":20,"tag":21,"props":27,"children":28},{},[29],{"type":25,"value":30},"Microsoft, taking a cue from the popularity of Ruby on Rails and subsequent .NET related efforts such as MonoRail, are embracing the model-view-controller (MVC) pattern and developing something more suited to web development than WebForms which aimed to make web development as similar to Windows development as possible (despite the major underlying differences in architecture).",{"type":17,"children":32,"toc":724},[33,37,41,83,95,102,142,148,171,177,217,223,236,242,250,256,291,297,436,442,468,474,514,520,598,604,633,639,677,683,696,702,715],{"type":20,"tag":21,"props":34,"children":35},{},[36],{"type":25,"value":9},{"type":20,"tag":21,"props":38,"children":39},{},[40],{"type":25,"value":30},{"type":20,"tag":21,"props":42,"children":43},{},[44,46,52,54,63,65,72,74,81],{"type":25,"value":45},"The prototype, currently named System.Web.Mvc ",{"type":20,"tag":47,"props":48,"children":49},"s",{},[50],{"type":25,"value":51},"or Microsoft.Web.Scalene depending on where you look",{"type":25,"value":53},", is headed by ",{"type":20,"tag":55,"props":56,"children":60},"a",{"href":57,"rel":58},"https://weblogs.asp.net/scottgu/",[59],"nofollow",[61],{"type":25,"value":62},"Scott Guthrie",{"type":25,"value":64}," with both ",{"type":20,"tag":55,"props":66,"children":69},{"href":67,"rel":68},"https://haacked.com",[59],[70],{"type":25,"value":71},"Phil Haack",{"type":25,"value":73}," and ",{"type":20,"tag":55,"props":75,"children":78},{"href":76,"rel":77},"https://www.hanselman.com",[59],[79],{"type":25,"value":80},"Scott Hanselman",{"type":25,"value":82}," involved (sounds like a dream project and team to be involved with) and a preview release (“drop”) is due within the coming weeks.",{"type":20,"tag":21,"props":84,"children":85},{},[86,93],{"type":20,"tag":55,"props":87,"children":90},{"href":88,"rel":89},"https://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx",[59],[91],{"type":25,"value":92},"Guthrie and Hanselman presented Microsoft MVC at the ALT.NET conference",{"type":25,"value":94}," which revealed some interesting details buried in the video, my rough observations and notes based on the prototype they showed follows:",{"type":20,"tag":96,"props":97,"children":99},"h2",{"id":98},"philosophy",[100],{"type":25,"value":101},"Philosophy",{"type":20,"tag":103,"props":104,"children":105},"ul",{},[106,112,117,122,127,132,137],{"type":20,"tag":107,"props":108,"children":109},"li",{},[110],{"type":25,"value":111},"Don’t repeat yourself",{"type":20,"tag":107,"props":113,"children":114},{},[115],{"type":25,"value":116},"Highly extensible & pluggable",{"type":20,"tag":107,"props":118,"children":119},{},[120],{"type":25,"value":121},"Use generics to achieve strong-typing without code generation",{"type":20,"tag":107,"props":123,"children":124},{},[125],{"type":25,"value":126},"Good performance, fast enough for large-scale sites",{"type":20,"tag":107,"props":128,"children":129},{},[130],{"type":25,"value":131},"Separation of concern for maintainability",{"type":20,"tag":107,"props":133,"children":134},{},[135],{"type":25,"value":136},"Clean URLs in and out",{"type":20,"tag":107,"props":138,"children":139},{},[140],{"type":25,"value":141},"Clean HTML",{"type":20,"tag":96,"props":143,"children":145},{"id":144},"extensible",[146],{"type":25,"value":147},"Extensible",{"type":20,"tag":103,"props":149,"children":150},{},[151,156,161,166],{"type":20,"tag":107,"props":152,"children":153},{},[154],{"type":25,"value":155},"Interfaces used extensively",{"type":20,"tag":107,"props":157,"children":158},{},[159],{"type":25,"value":160},"No sealed classes",{"type":20,"tag":107,"props":162,"children":163},{},[164],{"type":25,"value":165},"Plug-in points for view engines (e.g. MonoRail’s NVelocity, Brail)",{"type":20,"tag":107,"props":167,"children":168},{},[169],{"type":25,"value":170},"Support for Inversion of Control (IoC) engines (e.g. Windsor, StructureMap, Spring.NET)",{"type":20,"tag":96,"props":172,"children":174},{"id":173},"compatibility",[175],{"type":25,"value":176},"Compatibility",{"type":20,"tag":103,"props":178,"children":179},{},[180,185,190,195,207,212],{"type":20,"tag":107,"props":181,"children":182},{},[183],{"type":25,"value":184},"Runs on the .NET 2.0 CLR",{"type":20,"tag":107,"props":186,"children":187},{},[188],{"type":25,"value":189},"Some helper classes require .NET 3.5 (extension methods)",{"type":20,"tag":107,"props":191,"children":192},{},[193],{"type":25,"value":194},"Normal Request, Response objects (via interfaces for mocking)",{"type":20,"tag":107,"props":196,"children":197},{},[198,200],{"type":25,"value":199},"Does not support postback ",{"type":20,"tag":201,"props":202,"children":204},"code",{"className":203},[],[205],{"type":25,"value":206},"form runat=\"server\"",{"type":20,"tag":107,"props":208,"children":209},{},[210],{"type":25,"value":211},"Supports MasterPages, DataBinding, CodeBehind",{"type":20,"tag":107,"props":213,"children":214},{},[215],{"type":25,"value":216},"Existing .aspx’s are blocked using web.config",{"type":20,"tag":96,"props":218,"children":220},{"id":219},"visual-studio",[221],{"type":25,"value":222},"Visual Studio",{"type":20,"tag":103,"props":224,"children":225},{},[226,231],{"type":20,"tag":107,"props":227,"children":228},{},[229],{"type":25,"value":230},"Solution templates for web project and unit testing",{"type":20,"tag":107,"props":232,"children":233},{},[234],{"type":25,"value":235},"Full designer & IntelliSense integration",{"type":20,"tag":96,"props":237,"children":239},{"id":238},"flow",[240],{"type":25,"value":241},"Flow",{"type":20,"tag":103,"props":243,"children":244},{},[245],{"type":20,"tag":107,"props":246,"children":247},{},[248],{"type":25,"value":249},"Route -> ControllerFactory -> Controller -> Action -> ViewEngine -> View",{"type":20,"tag":96,"props":251,"children":253},{"id":252},"routing",[254],{"type":25,"value":255},"Routing",{"type":20,"tag":103,"props":257,"children":258},{},[259,264,281,286],{"type":20,"tag":107,"props":260,"children":261},{},[262],{"type":25,"value":263},"Routes can be defined dynamically and support RegEx URL matching",{"type":20,"tag":107,"props":265,"children":266},{},[267,273,275],{"type":20,"tag":201,"props":268,"children":270},{"className":269},[],[271],{"type":25,"value":272},"IControllerFactory",{"type":25,"value":274}," pops out the required ",{"type":20,"tag":201,"props":276,"children":278},{"className":277},[],[279],{"type":25,"value":280},"IController",{"type":20,"tag":107,"props":282,"children":283},{},[284],{"type":25,"value":285},"Routing is case insensitive by default",{"type":20,"tag":107,"props":287,"children":288},{},[289],{"type":25,"value":290},"Support REST, blog engine, Jango style mappings etc. default is /controller/action/parameters",{"type":20,"tag":96,"props":292,"children":294},{"id":293},"controllers",[295],{"type":25,"value":296},"Controllers",{"type":20,"tag":103,"props":298,"children":299},{},[300,305,338,395],{"type":20,"tag":107,"props":301,"children":302},{},[303],{"type":25,"value":304},"FrontController style",{"type":20,"tag":107,"props":306,"children":307},{},[308,313,315],{"type":20,"tag":201,"props":309,"children":311},{"className":310},[],[312],{"type":25,"value":280},{"type":25,"value":314}," exposes:\n",{"type":20,"tag":103,"props":316,"children":317},{},[318,327],{"type":20,"tag":107,"props":319,"children":320},{},[321],{"type":20,"tag":201,"props":322,"children":324},{"className":323},[],[325],{"type":25,"value":326},"Execute(IHttpContext context, RouteData routeData)",{"type":20,"tag":107,"props":328,"children":329},{},[330,336],{"type":20,"tag":201,"props":331,"children":333},{"className":332},[],[334],{"type":25,"value":335},"IViewEngine",{"type":25,"value":337}," ViewEngine property",{"type":20,"tag":107,"props":339,"children":340},{},[341,343],{"type":25,"value":342},"Some implementations available, all with virtual methods:\n",{"type":20,"tag":103,"props":344,"children":345},{},[346,357,376],{"type":20,"tag":107,"props":347,"children":348},{},[349,355],{"type":20,"tag":201,"props":350,"children":352},{"className":351},[],[353],{"type":25,"value":354},"ControllerBase",{"type":25,"value":356}," (adds dispatching)",{"type":20,"tag":107,"props":358,"children":359},{},[360,366,368,374],{"type":20,"tag":201,"props":361,"children":363},{"className":362},[],[364],{"type":25,"value":365},"Controller",{"type":25,"value":367}," (Populate parameters into ",{"type":20,"tag":201,"props":369,"children":371},{"className":370},[],[372],{"type":25,"value":373},"ViewData[\"key\"]",{"type":25,"value":375},")",{"type":20,"tag":107,"props":377,"children":378},{},[379,385,387,393],{"type":20,"tag":201,"props":380,"children":382},{"className":381},[],[383],{"type":25,"value":384},"Controller\u003CT>",{"type":25,"value":386}," (Populates parameters by making ",{"type":20,"tag":201,"props":388,"children":390},{"className":389},[],[391],{"type":25,"value":392},"ViewData",{"type":25,"value":394}," type T)",{"type":20,"tag":107,"props":396,"children":397},{},[398,400],{"type":25,"value":399},"Attributes\n",{"type":20,"tag":103,"props":401,"children":402},{},[403,414,425],{"type":20,"tag":107,"props":404,"children":405},{},[406,412],{"type":20,"tag":201,"props":407,"children":409},{"className":408},[],[410],{"type":25,"value":411},"[ControllerAction]",{"type":25,"value":413}," attribute to expose methods as actions (secure default behavior by not exposing helper methods)",{"type":20,"tag":107,"props":415,"children":416},{},[417,423],{"type":20,"tag":201,"props":418,"children":420},{"className":419},[],[421],{"type":25,"value":422},"Attribute",{"type":25,"value":424}," for output caching",{"type":20,"tag":107,"props":426,"children":427},{},[428,434],{"type":20,"tag":201,"props":429,"children":431},{"className":430},[],[432],{"type":25,"value":433},"[ControllerAction(DefaultAction=true)]",{"type":25,"value":435}," to override default method of Index",{"type":20,"tag":96,"props":437,"children":439},{"id":438},"parameters-to-the-controller",[440],{"type":25,"value":441},"Parameters (to the controller)",{"type":20,"tag":103,"props":443,"children":444},{},[445,458,463],{"type":20,"tag":107,"props":446,"children":447},{},[448,450,456],{"type":25,"value":449},"Automatically parsed where a ",{"type":20,"tag":201,"props":451,"children":453},{"className":452},[],[454],{"type":25,"value":455},"TypeConverter",{"type":25,"value":457}," exists",{"type":20,"tag":107,"props":459,"children":460},{},[461],{"type":25,"value":462},"Future versions will support more complex serialization of types",{"type":20,"tag":107,"props":464,"children":465},{},[466],{"type":25,"value":467},"Can be nullable: use null coalesce operator for defaults",{"type":20,"tag":96,"props":469,"children":471},{"id":470},"view-engine",[472],{"type":25,"value":473},"View Engine",{"type":20,"tag":103,"props":475,"children":476},{},[477,497],{"type":20,"tag":107,"props":478,"children":479},{},[480,485],{"type":20,"tag":201,"props":481,"children":483},{"className":482},[],[484],{"type":25,"value":335},{"type":20,"tag":103,"props":486,"children":487},{},[488],{"type":20,"tag":107,"props":489,"children":490},{},[491],{"type":20,"tag":201,"props":492,"children":494},{"className":493},[],[495],{"type":25,"value":496},"IView LoadView(string viewName)",{"type":20,"tag":107,"props":498,"children":499},{},[500,502],{"type":25,"value":501},"Implementations include:\n",{"type":20,"tag":103,"props":503,"children":504},{},[505],{"type":20,"tag":107,"props":506,"children":507},{},[508],{"type":20,"tag":201,"props":509,"children":511},{"className":510},[],[512],{"type":25,"value":513},"WebFormViewEngine",{"type":20,"tag":96,"props":515,"children":517},{"id":516},"views",[518],{"type":25,"value":519},"Views",{"type":20,"tag":103,"props":521,"children":522},{},[523,544],{"type":20,"tag":107,"props":524,"children":525},{},[526,532],{"type":20,"tag":201,"props":527,"children":529},{"className":528},[],[530],{"type":25,"value":531},"IView",{"type":20,"tag":103,"props":533,"children":534},{},[535],{"type":20,"tag":107,"props":536,"children":537},{},[538],{"type":20,"tag":201,"props":539,"children":541},{"className":540},[],[542],{"type":25,"value":543},"virtual void RenderView(object data)",{"type":20,"tag":107,"props":545,"children":546},{},[547,548],{"type":25,"value":501},{"type":20,"tag":103,"props":549,"children":550},{},[551,575],{"type":20,"tag":107,"props":552,"children":553},{},[554,560,562,568,570],{"type":20,"tag":201,"props":555,"children":557},{"className":556},[],[558],{"type":25,"value":559},"ViewPage",{"type":25,"value":561},": pick up parameters from ",{"type":20,"tag":201,"props":563,"children":565},{"className":564},[],[566],{"type":25,"value":567},"ViewData[\"\"]",{"type":25,"value":569}," in conjunction with ",{"type":20,"tag":201,"props":571,"children":573},{"className":572},[],[574],{"type":25,"value":365},{"type":20,"tag":107,"props":576,"children":577},{},[578,584,586,591,593],{"type":20,"tag":201,"props":579,"children":581},{"className":580},[],[582],{"type":25,"value":583},"ViewPage\u003CT>",{"type":25,"value":585}," pick up parameters from ",{"type":20,"tag":201,"props":587,"children":589},{"className":588},[],[590],{"type":25,"value":392},{"type":25,"value":592}," as type T in conjunction with ",{"type":20,"tag":201,"props":594,"children":596},{"className":595},[],[597],{"type":25,"value":384},{"type":20,"tag":96,"props":599,"children":601},{"id":600},"html",[602],{"type":25,"value":603},"HTML",{"type":20,"tag":103,"props":605,"children":606},{},[607,612,617,628],{"type":20,"tag":107,"props":608,"children":609},{},[610],{"type":25,"value":611},"Clean HTML generation (have they sorted out the id mangling by MasterPages/INamingContainer?)",{"type":20,"tag":107,"props":613,"children":614},{},[615],{"type":25,"value":616},"Static HTML class supports Link, PagingLinks and Url methods",{"type":20,"tag":107,"props":618,"children":619},{},[620,622],{"type":25,"value":621},"Map to action names using Lambda expressions to ensure follows refactoring, e.g.\n",{"type":20,"tag":201,"props":623,"children":625},{"className":624},[],[626],{"type":25,"value":627},"string url = Html.Link\u003CProductController>(controller =>controller.Edit(4);",{"type":20,"tag":107,"props":629,"children":630},{},[631],{"type":25,"value":632},"Is there a way to follow the default action?",{"type":20,"tag":96,"props":634,"children":636},{"id":635},"modeldata",[637],{"type":25,"value":638},"Model/data",{"type":20,"tag":103,"props":640,"children":641},{},[642,655,660],{"type":20,"tag":107,"props":643,"children":644},{},[645,647,653],{"type":25,"value":646},"Pagination extension methods extend ",{"type":20,"tag":201,"props":648,"children":650},{"className":649},[],[651],{"type":25,"value":652},"IQueryable",{"type":25,"value":654}," for getting pages of data (skip, limit)",{"type":20,"tag":107,"props":656,"children":657},{},[658],{"type":25,"value":659},"Pattern for view-update-view cycle",{"type":20,"tag":107,"props":661,"children":662},{},[663,665],{"type":25,"value":664},"Object property to form field id mapping available and pluggable, allows\n",{"type":20,"tag":103,"props":666,"children":667},{},[668],{"type":20,"tag":107,"props":669,"children":670},{},[671],{"type":20,"tag":201,"props":672,"children":674},{"className":673},[],[675],{"type":25,"value":676},"product.UpdateFrom(Request.Form)",{"type":20,"tag":96,"props":678,"children":680},{"id":679},"testing",[681],{"type":25,"value":682},"Testing",{"type":20,"tag":103,"props":684,"children":685},{},[686,691],{"type":20,"tag":107,"props":687,"children":688},{},[689],{"type":25,"value":690},"Easy to write tests by using mock objects (request, response)",{"type":20,"tag":107,"props":692,"children":693},{},[694],{"type":25,"value":695},"Unit testing framework project (NUnit, MBUnit, xUnit.NET)",{"type":20,"tag":96,"props":697,"children":699},{"id":698},"finally",[700],{"type":25,"value":701},"Finally",{"type":20,"tag":103,"props":703,"children":704},{},[705,710],{"type":20,"tag":107,"props":706,"children":707},{},[708],{"type":25,"value":709},"What’s with ScottGu’s nametag, can the show’s organizers not afford anything more than a Post It note?",{"type":20,"tag":107,"props":711,"children":712},{},[713],{"type":25,"value":714},"What cool software is Scott Hanselman using to do the screen-cast video/zoom/overlay/highlighting?",{"type":20,"tag":21,"props":716,"children":717},{},[718],{"type":20,"tag":719,"props":720,"children":721},"em",{},[722],{"type":25,"value":723},"[)amien",{"title":725,"searchDepth":726,"depth":726,"links":727},"",2,[728,729,730,731,732,733,734,735,736,737,738,739,740,741],{"id":98,"depth":726,"text":101},{"id":144,"depth":726,"text":147},{"id":173,"depth":726,"text":176},{"id":219,"depth":726,"text":222},{"id":238,"depth":726,"text":241},{"id":252,"depth":726,"text":255},{"id":293,"depth":726,"text":296},{"id":438,"depth":726,"text":441},{"id":470,"depth":726,"text":473},{"id":516,"depth":726,"text":519},{"id":600,"depth":726,"text":603},{"id":635,"depth":726,"text":638},{"id":679,"depth":726,"text":682},{"id":698,"depth":726,"text":701},"markdown","content:blog:2007:observations-on-microsoft-mvc-for-aspnet.md","content","blog/2007/observations-on-microsoft-mvc-for-aspnet.md","blog/2007/observations-on-microsoft-mvc-for-aspnet","md","/blog/2007/observations-on-microsoft-mvc-for-aspnet/",594,3,9,[753,757,761],{"title":754,"date":755,"url":756},"HTML5 Video Cheatsheet: Optimizing videos for the web","2025-12-05T00:00:00Z","/blog/2025/html5-video-cheatsheet/",{"title":758,"date":759,"url":760},"Transactions in the MongoDB EF Core Provider","2025-10-25","/blog/2025/mongodb-explicit-transactions/",{"title":762,"date":763,"url":764},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","/blog/2025/mongodb-queryable-encryption/",[766,787,813,853,879,915,946,977,998],{"_path":767,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":769,"description":770,"id":771,"name":772,"email":773,"avatar":774,"date":775,"body":776,"_type":742,"_id":784,"_source":744,"_file":785,"_stem":786,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/9743","observations-on-microsoft-mvc-for-aspnet","9743","This is very productive step to be taken. Specially the concept of the separation of concerns and eliminating the depedencies should be taken care of. After all the goal should be maximum reusable and extensiblity.",9743,"Syed Ali Shah","alishah12@gmail.com","https://www.gravatar.com/avatar/947e897d249b2302e878a6373a5c8d5a?r=pg&d=retro","2008-10-19T19:20:41",{"type":17,"children":777,"toc":782},[778],{"type":20,"tag":21,"props":779,"children":780},{},[781],{"type":25,"value":770},{"title":725,"searchDepth":726,"depth":726,"links":783},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:9743.md","comments/observations-on-microsoft-mvc-for-aspnet/9743.md","comments/observations-on-microsoft-mvc-for-aspnet/9743",{"_path":788,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":789,"description":790,"id":791,"name":792,"email":793,"avatar":794,"url":795,"date":796,"body":797,"_type":742,"_id":810,"_source":744,"_file":811,"_stem":812,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4725","4725","\"This is a cool step in the right direction, especially for the likes of me who want to use .NET but also like the MVC methodology and do not wish to switch to PHP or other more Linuxy solutions.\"",4725,"steve","steve@stevestreeting.com","https://www.gravatar.com/avatar/fbe8cc9ac5bc8797382e01e10f5f8e33?r=pg&d=retro","https://www.stevestreeting.com","2007-10-23T18:24:30",{"type":17,"children":798,"toc":808},[799,803],{"type":20,"tag":21,"props":800,"children":801},{},[802],{"type":25,"value":790},{"type":20,"tag":21,"props":804,"children":805},{},[806],{"type":25,"value":807},"For what it's worth, Struts (Java) implemented everything in this list in approximately 2000/2001 and real, production systems have been deployed on it, and other systems which have sprung up since as alternative takes on the model. You can basically get MVC frameworks most places except .Net, where once again they're reinventing the wheel.",{"title":725,"searchDepth":726,"depth":726,"links":809},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4725.md","comments/observations-on-microsoft-mvc-for-aspnet/4725.md","comments/observations-on-microsoft-mvc-for-aspnet/4725",{"_path":814,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":815,"description":816,"id":817,"name":818,"email":819,"avatar":820,"url":821,"date":822,"body":823,"_type":742,"_id":850,"_source":744,"_file":851,"_stem":852,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4644","4644","To be honest, the lack of any real MVC for .NET put me off moving solely to it, and I stuck with classic ASP. I built a few projects using Monorail from the Castle Project which brought MVC to .NET but compatibility issues (especially now, with trust problems in the apps i created on Win2k3 Server) made me step back as it was a non-standard solution.",4644,"Steve Woods","steve@swoo.co.uk","https://www.gravatar.com/avatar/ec8ae1580d755c6ea6ea5bae7ac16524?r=pg&d=retro","https://www.swoo.co.uk/","2007-10-17T15:57:32",{"type":17,"children":824,"toc":848},[825,838,843],{"type":20,"tag":21,"props":826,"children":827},{},[828,830,836],{"type":25,"value":829},"To be honest, the lack of any real MVC for .NET put me off moving solely to it, and I stuck with classic ASP. I built a few projects using Monorail from the Castle Project which brought MVC to .NET but compatibility issues (especially now, with trust problems ",{"type":20,"tag":831,"props":832,"children":833},"span",{},[834],{"type":25,"value":835},"in the apps i created",{"type":25,"value":837}," on Win2k3 Server) made me step back as it was a non-standard solution.",{"type":20,"tag":21,"props":839,"children":840},{},[841],{"type":25,"value":842},"This is a cool step in the right direction, especially for the likes of me who want to use .NET but also like the MVC methodology and do not wish to switch to PHP or other more Linuxy solutions.",{"type":20,"tag":21,"props":844,"children":845},{},[846],{"type":25,"value":847},"Interesting stuff :D",{"title":725,"searchDepth":726,"depth":726,"links":849},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4644.md","comments/observations-on-microsoft-mvc-for-aspnet/4644.md","comments/observations-on-microsoft-mvc-for-aspnet/4644",{"_path":854,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":855,"description":856,"id":857,"name":858,"email":859,"avatar":860,"url":861,"date":862,"body":863,"_type":742,"_id":876,"_source":744,"_file":877,"_stem":878,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4573","4573","About the clean HTML, ID generation:  You get to handle it yourself.  I, for one, welcome this change, as the naming containers tend to make th nastiest looking ID elements, just in case they might collide.",4573,"Ben Scheirman","subdigital@gmail.com","https://www.gravatar.com/avatar/d505f40ec41c8ec63b7f594d032ee244?r=pg&d=retro","https://www.flux88.com","2007-10-12T13:26:07",{"type":17,"children":864,"toc":874},[865,869],{"type":20,"tag":21,"props":866,"children":867},{},[868],{"type":25,"value":856},{"type":20,"tag":21,"props":870,"children":871},{},[872],{"type":25,"value":873},"This will allow javascript integration with less... friction.",{"title":725,"searchDepth":726,"depth":726,"links":875},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4573.md","comments/observations-on-microsoft-mvc-for-aspnet/4573.md","comments/observations-on-microsoft-mvc-for-aspnet/4573",{"_path":880,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":881,"description":882,"id":883,"name":884,"email":885,"avatar":886,"date":887,"body":888,"_type":742,"_id":912,"_source":744,"_file":913,"_stem":914,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4567","4567","Screencast software I guess is something like Camtasia by TechSmith.  I'm sure that records you and the screen at the same time.",4567,"Ben Hall","ben2004uk@gmail.com","https://www.gravatar.com/avatar/0a0364b6d8a2df3c898232300548ef69?r=pg&d=retro","2007-10-11T09:29:31",{"type":17,"children":889,"toc":910},[890,894,899],{"type":20,"tag":21,"props":891,"children":892},{},[893],{"type":25,"value":882},{"type":20,"tag":21,"props":895,"children":896},{},[897],{"type":25,"value":898},"As for the zooming, looks like ZoomIt!",{"type":20,"tag":21,"props":900,"children":901},{},[902,904],{"type":25,"value":903},"Can't remember seeing the highlighting.... ",{"type":20,"tag":55,"props":905,"children":907},{"href":906},"https://www.hanselman.com/blog/ShortMyVisualStudioColorSettings.aspx",[908],{"type":25,"value":909},"His theme is available on his blog",{"title":725,"searchDepth":726,"depth":726,"links":911},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4567.md","comments/observations-on-microsoft-mvc-for-aspnet/4567.md","comments/observations-on-microsoft-mvc-for-aspnet/4567",{"_path":916,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":917,"description":918,"id":919,"name":920,"email":921,"avatar":922,"url":923,"date":924,"body":925,"_type":742,"_id":943,"_source":744,"_file":944,"_stem":945,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4563","4563","great summarisation,",4563,"bonskijr","jedi_knyt23@yahoo.com","https://www.gravatar.com/avatar/6d90b9ed7391ac6d4fbe61718218a0f7?r=pg&d=retro","https://devpinoy.org/blogs/bonskijr","2007-10-10T19:50:29",{"type":17,"children":926,"toc":941},[927,931,936],{"type":20,"tag":21,"props":928,"children":929},{},[930],{"type":25,"value":918},{"type":20,"tag":21,"props":932,"children":933},{},[934],{"type":25,"value":935},"if i'm not mistaken ScottHa is using ZoomIt tool from sysinternals suite..",{"type":20,"tag":21,"props":937,"children":938},{},[939],{"type":25,"value":940},"regards",{"title":725,"searchDepth":726,"depth":726,"links":942},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4563.md","comments/observations-on-microsoft-mvc-for-aspnet/4563.md","comments/observations-on-microsoft-mvc-for-aspnet/4563",{"_path":947,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":948,"description":949,"id":950,"name":951,"email":952,"avatar":953,"url":954,"date":955,"body":956,"_type":742,"_id":974,"_source":744,"_file":975,"_stem":976,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4547","4547","Hi,",4547,"Mark Pollack","mpollack@interface21.com","https://www.gravatar.com/avatar/cef0151f7d9e85f4054c68c02dcd9f90?r=pg&d=retro","https://www.springframework.net","2007-10-09T20:40:23",{"type":17,"children":957,"toc":972},[958,962,967],{"type":20,"tag":21,"props":959,"children":960},{},[961],{"type":25,"value":949},{"type":20,"tag":21,"props":963,"children":964},{},[965],{"type":25,"value":966},"Great summary.  Just a small clarification, Spring.NET's web support is not MVC based.  The approach is to still use WebForms, but remove as much of the pain as possible with that approach, i.e. dependency injection for aspx, custom http modules, as well as a better page lifecycle that allows for bi-directional databinding, validation etc.   Of course, we will be working to bring added value to the new MVC stack.",{"type":20,"tag":21,"props":968,"children":969},{},[970],{"type":25,"value":971},"Cheers,\nMark",{"title":725,"searchDepth":726,"depth":726,"links":973},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4547.md","comments/observations-on-microsoft-mvc-for-aspnet/4547.md","comments/observations-on-microsoft-mvc-for-aspnet/4547",{"_path":978,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":979,"description":980,"id":981,"name":982,"email":983,"avatar":984,"url":985,"date":986,"body":987,"_type":742,"_id":995,"_source":744,"_file":996,"_stem":997,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4545","4545","Better late than never... and they're serious on soliciting feedback on this.",4545,"Damien Guard","damien@envytech.co.uk","https://www.gravatar.com/avatar/dc72963e7279d34c85ed4c0b731ce5a9?r=pg&d=retro","https://damieng.com/","2007-10-09T18:47:16",{"type":17,"children":988,"toc":993},[989],{"type":20,"tag":21,"props":990,"children":991},{},[992],{"type":25,"value":980},{"title":725,"searchDepth":726,"depth":726,"links":994},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4545.md","comments/observations-on-microsoft-mvc-for-aspnet/4545.md","comments/observations-on-microsoft-mvc-for-aspnet/4545",{"_path":999,"_dir":768,"_draft":6,"_partial":6,"_locale":7,"title":1000,"description":1001,"id":1002,"name":792,"email":793,"avatar":794,"url":795,"date":1003,"body":1004,"_type":742,"_id":1012,"_source":744,"_file":1013,"_stem":1014,"_extension":747},"/comments/observations-on-microsoft-mvc-for-aspnet/4543","4543","Talk about being late to the party; everyone else has been using MVC for web applications for about 8 years....",4543,"2007-10-09T17:30:49",{"type":17,"children":1005,"toc":1010},[1006],{"type":20,"tag":21,"props":1007,"children":1008},{},[1009],{"type":25,"value":1001},{"title":725,"searchDepth":726,"depth":726,"links":1011},[],"content:comments:observations-on-microsoft-mvc-for-aspnet:4543.md","comments/observations-on-microsoft-mvc-for-aspnet/4543.md","comments/observations-on-microsoft-mvc-for-aspnet/4543",1779264590785]