вторник, 29 сентября 2009 г.

ASP.NET white space cleaning with no runtime cost

I think many asp.net developer looking at the markup generated by a ASP.NET pages wanted to get rid of those white space without necessity of changing nice indents of their pages and user controls.

Existing solutions of the problem based on one of the two methods: implementing a cleaning HtmlTextWriter and returning an instance of it in Page.CreateHtmlTextWriter  override, or implementing a cleaning Stream and setting the HttpResponse.Filter property to an instance of the Stream.

But both methods incur runtime performance costs (I am going to show in a next post why that happens).
In my solution white space in generated markup removed at pages’ compile time, so that at runtime it looks as if white space was removed manually by the developers.

One would say that it is not actually a solution because it relies on Reflection and depends on implementation details of the particular version of ASP.NET. I would answer – Thanks God that I haven’t had to resort to the help of unsafe code and pointer arithmetic :)

Let’s start with the beginning. When ASP.NET generates C#/VB code for an ASP.NET page it uses ControlBuilders representing almost every entity (except text) in the page tree. Besides holding information about the part of the page it represents, they let controls creators change different aspects of generated code (in .NET 3.5 SP1 including ability to change generated CodeDom). For regular pages control builders exist at compile time only, but in “no compile” pages they actually create at runtime the parts they are responsible for.
As a page at runtime time is a tree of controls, server side code and text , the page at compile time is a tree of control builders. Each builder holds a collection of subbuilders in an ArrayList. Untyped collection is used because literal strings are placed in subbuilders collection not being wrapped in control builders.

Knowing all that we can traverse control builder tree from the root, iterate over the each builder’s subbuilders collection, find instances of strings and replace them with cleaned versions.

Getting access to the root control builder at right time was not easy. I tried different ways but all had shortcomings or inconveniences. But then examining .NET sources by Reflector I found the perfect way - PageParserFilter. PageParserFilter “provides an abstract base class for a page parser filter that is used by the ASP.NET parser to determine whether an item is allowed in the page at parse time”. This ability (among other useful things) was added to ASP.NET 2.0 as a result of cooperation between ASP.NET team and SharePoint team poring their product to ASP.NET. The only method of interest now is PageParserFilter.ParseComplete(ControlBuilder rootBuilder) and it is the right place and time for accessing the root builder. The remaining part is easy. See the attached web site project. Compile the classes in a dll, drop it in  Bin folder, small change to web.config and voilà– ASP.NET white space cleaning with no runtime cost!

BTW the code has been working for a few projects in the wild with no problems.

UPDATE (17 Aug 2010):  I’ve  updated the sample to work with MVC 2  and MVC 3 Preview 1 (including support of Razor view engine).

UPDATE (9 Oct 2010):  Now it works with MVC 3 Beta.

UPDATE (4 May 2011):  Finally with MVC 3 RTW

387 комментариев:

  1. Wow! Thanks. I've been looking for this solution for a long time. Even the excellent 'Ultra-Fast ASP.NET' book doesn't cover this topic (tricks of the compile-time stage).

    ОтветитьУдалить
  2. @thorn: Yes, it seems ControlBuilder mechanism is not that flexible bacause it was created mostly for internal purposes

    ОтветитьУдалить
  3. Let's vote for making this mechanism more open: http://aspnet.uservoice.com/forums/41202-asp-net-webforms/suggestions/488607

    ОтветитьУдалить
  4. how do you make this work? I've changed the web.config, added the classes and pasted using Omari.Web.UI in my page and masterpage. It does noghing yet.

    ОтветитьУдалить
  5. @Flori: Have you set debug="false" in your web.config?

    ОтветитьУдалить
  6. This worked like a charm for me. Basically you just need the three class files in the app_Code and build in the project. My page size went form 142kb to 90kb ~50kb reduction.

    Checkout my live implementation at http://fullmeals.net

    ОтветитьУдалить
  7. this is EXCELLENT. I hope you package it up somehow and sell it, honestly. Make a few small improvements to cleaning up additional whitespace and it will be golden. Well done, great work.

    ewart @ ihug dot co dot nz

    wish I knew which button was send in russian!

    ОтветитьУдалить
  8. What about css and js optimization? Is this posible using this technology?

    ОтветитьУдалить
  9. Kiril, unlike web pages, css and js are static in their nature. They can be easily minimized, combined, zipped and cached.

    ОтветитьУдалить
  10. Hi Omari,

    This project sounds great and I'd really like to try it out, but I'm having trouble getting this to work even for the included WebForms or the MMVC2 example projects (I'm not using MVC3 Beta yet, although I'm looking forward to Razor when it goes RTM). I double checked that debug="false" is set and the binaries are where they are supposed to be, I've tried running it from Visual Studio 2010 and from IIS 7.5, and I've even tried re-downloading and extracting the zip somewhere else and starting from scratch again to get one of the examples to work. But no luck. Am I missing something obvious? Is it possible that the recent MVC3 update broke MVC2 support?

    Looking forward to getting it working! :)

    ОтветитьУдалить
  11. Any chance you can update again to include proper support in RC2? I had an issue here http://stackoverflow.com/questions/4414231/why-am-i-getting-asp-net-mvc3-razor-syntax-errors

    ОтветитьУдалить
  12. Anybody have a working version with ASP.NET MVC 3 RTM ?

    ОтветитьУдалить
  13. Hey, great tool! Any chance of an update since the the latest MVC release?

    ОтветитьУдалить
  14. Very impressive... Was looking for exactly this! Thank you very much!

    ОтветитьУдалить
  15. Why do you require debug="true"?

    May I step over this check in you code just to debug it?

    ОтветитьУдалить
  16. www.gourmandia.com - Gourmandia is a culinary website offering videos of world-class Michelin rated chefs exhibiting their techniques. Also features documentaries on fine dining restaurant locations and cities, recipes, forum, and more. At www.gourmetrecipe.com - Gourmet Recipe is the place to find the tastiest, healthiest gourmet recipes. Watch videos of great chefs preparing meals, find easy beginner dishes, and more.

    ОтветитьУдалить
  17. There are many ways to improve your cooking abilities into the whole new level. Try to visit these sites http://www.gourmandia.com , http://www.gourmetrecipe.com , http://www.foodiamond.com , http://www.xdestination.com and their sub-domains. Feel free to suggest and recommend what these sites can offer. Online cooking recipes are never been this good for they have featured recipes that are truly remarkable. In addition, the site offers easy and quick recipes with featured video that are easy to follow from the world-class Michelin. Visit now and have some fun.

    ОтветитьУдалить
  18. I appreciate your time and effort to come up this kind of article. Try to take a glance at gourmetrecipe. A recommendation for you to relax and unwind for a while...In that website you will find many tasty and nutritious dishes for you to choose from and your family. I also assure you, you won't regret it for visiting this site.

    ОтветитьУдалить
  19. This is really cool. Thanks for building it!!

    Please consider making this into a Nuget package so it can be easily installed and discovered.

    ОтветитьУдалить
  20. Such a wonderful post. Asp.net Development is one of the most popular application development now-a-days. We are also providing some good tips related to this post.Great work.

    ОтветитьУдалить
  21. This is the best solution I've seen. I tried recompiling for MVC4 but it fails to load the WhiteSpaceCleaningMvcWebRazorHostFactory. Any pointers on what I might need to do in order for it to work?

    ОтветитьУдалить
  22. Very cool post. Nuget package would be a great idea.

    However, It doesn't seem to work with MVC3. I'm getting "Access is denied: 'System.Web.Mvc.Razor.MvcCSharpRazorCodeGenerator'." errors. Is there a workaround to fix it?

    Thanks.

    ОтветитьУдалить
  23. What about version for MVC4?
    The previous versions works great.

    ОтветитьУдалить
  24. Этот комментарий был удален автором.

    ОтветитьУдалить
  25. Nice work. unfortunately, This is not working at all for me in MVC3.
    Can you upload a working solution.It would helpfil if you have a readme.txt file to demonstrate what steps need to follow to make it work.

    ОтветитьУдалить
  26. Great Solution. It helped me a lot.:)

    ОтветитьУдалить
  27. I can see attached solution. Where can I download the code from?

    ОтветитьУдалить
  28. can anyone tell me where can I download the code?

    ОтветитьУдалить
  29. Hi Omari,

    Could you please re-upload the code? Skydrive embed link is broken :(

    Thanks!

    ОтветитьУдалить
  30. Hey Omari,

    Your site is broken, I would realy like to take a look at this library.

    Thanks!

    ОтветитьУдалить
  31. This is ansuperior writing service point that doesn't always sink in within the context of the classroom. In the first superior writing service paragraph you either hook the reader's interest or lose it. Of course your teacher, who's getting paid to teach you how to write an good essay, 
    This is ansuperior writing service point that doesn't always sink in within the context of the classroom. In the first superior writing service paragraph you either hook the reader's interest or lose it. Of course your teacher, who's getting paid to teach you how to write an good essay, 

    ОтветитьУдалить
  32. Thanks for Sharing this useful information. Get sharepoint apps development from veelead solutions

    ОтветитьУдалить
  33. Thanks for sharing it.I got Very valuable information from your blog.your post is really very Informatve. I got Very valuable information from your blog.I’m satisfied with the information that you provide for me.

    Python Training in Pune
    Python Classes
    Python Placement
    Python Institute Pune
    Python courses

    ОтветитьУдалить
  34. Thanks for your excellent blog and giving great kind of information. So useful. Nice work keep it up thanks for sharing the knowledge.
    Click Here
    For More Details
    Visit Website
    See More

    ОтветитьУдалить
  35. Thanks for sharing it.I got Very valuable information from your blog.your post is really very Informatve. I got Very valuable information from your blog.I’m satisfied with the information that you provide for me.

    DevOps Training in Pune
    DevOps Training
    DevOps Placement
    DevOps Institute Pune
    devops training in pune with placement


    ОтветитьУдалить
  36. I am a regular reader of your blog and I find it really informative. Hope more Articles From You.Best Tableau tutorial videos with Real time scenarios . hope more articles from you.

    ОтветитьУдалить
  37. It's almost that time of the year when you get the hottest deals on Web Hosting, you guessed it right! It's time for the Black Friday Web Hosting Deals 2019. Companies are lining up some of the best deals ever for 2019 buyers will have a lot to pick from in the industry.

    ОтветитьУдалить
  38. Thanks a lot for sharing it, that’s truly has added a lot to our knowledge about this topic. Have a more success ful day. Amazing write-up, always find something interesting and here i want to share some thing about mule 4 training.

    ОтветитьУдалить
  39. Thanks for sharing it.I got Very valuable information from your blog.your post is really very Informatve. I got Very valuable information from your blog.I’m satisfied with the information that you provide for me.

    aws course
    aws certification
    aws syllabus
    aws syllabus

    ОтветитьУдалить
  40. Thanks for your excellent blog and giving great kind of information. So useful. Nice work keep it up thanks for sharing the knowledge.
    Visit us
    Click Here
    For More Details
    Visit Website

    ОтветитьУдалить
  41. Thanks for sharing it.I got Very valuable information from your blog.your post is really very Informatve.I’m satisfied with the information that you provide for me.

    data science course form

    ОтветитьУдалить
  42. We as a team of real-time industrial experience with a lot of knowledge in developing applications in python programming (7+ years) will ensure that we will deliver our best in python training in vijayawada. , and we believe that no one matches us in this context.

    ОтветитьУдалить
  43. Этот комментарий был удален автором.

    ОтветитьУдалить
  44. Этот комментарий был удален автором.

    ОтветитьУдалить
  45. Learn best practice and get your questions answered with our Expert, Register Now for Demo at Apex Trainings Academy.
    full stack developer course in Hyderabad
    full stack developer course

    ОтветитьУдалить

  46. This is a wonderful article, Given so much info in it, These type of articles keeps the users interest in the website, and keep on sharing more ... good luck... Thank you!!! machine learning courses in Bangalore

    ОтветитьУдалить
  47. This is a wonderful article, Given so much info in ExcelR Machine Learning Courses In Pune it, These type of articles keeps the users interest in the website, and keep on sharing more ... good luck.

    ОтветитьУдалить

  48. Thanks for sharing such a great information.It is really one of the finest article and more informative too. I want to share some informative data about c net training and c# videos . Expecting more articles from you. Expecting more articles from you.

    ОтветитьУдалить
  49. Shopclues lucky draw 2020| Shopclues winner 2020|Get to Know Shopclues Lucky Draw Winner 2020. Call Shopclues Helpline Phone Number+91-9835565523 for Shopclues Online Shopping Lucky Draw.
    Shopclues online lucky draw winner
    Shopclues winner 2020
    shopclues car lucky draw

    ОтветитьУдалить
  50. This is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious.... sap bi tutorial

    ОтветитьУдалить


  51. Pretty article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision. i also want to share some infor mation regarding sap online course and sap sd training .keep sharing.

    ОтветитьУдалить
  52. Thank you for sharing the best information
    Snapdeal winner 2020 | Dear customer, you can complain here If you get to call and SMS regarding Snapdeal lucky draw, Mahindra xuv 500, lucky draw contest, contact us at to know the actual Snapdeal prize winners 2020.
    Snapdeal winner 2020
    Snapdeal lucky draw winner 2020
    Snapdeal lucky draw contest 2020
    snapdeal winner prizes 2020

    ОтветитьУдалить
  53. Your blog is splendid, I follow and read continuously the blogs that you share, they have some really important information. M glad to be in touch plz keep up the good work.
    ExcelR Solutions

    ОтветитьУдалить
  54. Nice article. For offshore hiring services visit:
    fairygodboss

    ОтветитьУдалить
  55. Snapdeal lucky winner 2020 | Snapdeal online lucky Draw 2020 | Snapdeal Winner List 2020 here came up with an Offer where you can win Snapdeal prize by just playing a game & win prizes
    snapdeal winner prizes 2020
    Snapdeal winner 2020
    Snapdeal lucky Draw 2020
    Snapdeal online lucky draw 2020

    ОтветитьУдалить
  56. Wow it is really wonderful and awesome thus it is very much useful for me to understand many concepts and helped me a lot. it is really explainable very well and i got more information from your blog.
    Digital Marketing Certification Course

    ОтветитьУдалить
  57. Thanks you for sharing this informative and useful article.Really interesting and awesome article.
    Data Science Training in Hyderabad

    ОтветитьУдалить
  58. Excellent blog I visit this blog it's really awesome. The important thing is that in this blog content written clearly and understandable. The content of Devops is very informative.
    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ОтветитьУдалить
  59. Pretty article! I found some useful information in your blog, it was awesome to read servicenow online training , thanks for sharing this great content to my vision, keep sharing.

    ОтветитьУдалить
  60. Informative post, i love reading such posts. Read my posts here
    Cannabizconnection
    Referall
    GTA Stunting

    ОтветитьУдалить
  61. haii
    thanks for sharing nice information. its Very use full and informative and keep sharing.
    https://www.analyticspath.com/artificial-intelligence-training-in-hyderabad

    ОтветитьУдалить
  62. Really nice and interesting post. I was looking for this kind of information and enjoyed reading this one. Keep posting. Thanks for sharing.....bangalore digital marketing course

    ОтветитьУдалить
  63. This is a great post. I like this topic.This site has lots of advantage.I found many interesting things from this site. It helps me in many ways.Thanks for posting this again.I really like this topic.
    devops training in chennai | devops training in anna nagar | devops training in omr | devops training in porur | devops training in tambaram | devops training in velachery

    ОтветитьУдалить
  64. thanks for sharing nice information. its Very use full and informative and keep sharing.
    more : https://www.kellytechno.com/Hyderabad/Course/AI-Training-In-Hyderabad

    ОтветитьУдалить
  65. thanks for sharing nice information....
    more : https://www.kellytechno.com/Hyderabad/Course/python-training

    ОтветитьУдалить
  66. Hey, i liked reading your article. You may go through few of my creative works here
    Diigo
    Openclassrooms

    ОтветитьУдалить
  67. A backlink is a link created when one website links to another. Backlinks are important to SEO & impact for higher ranking. In my 7+ years seo Career i see, without backlinks a website doesn't rank higher on google SERP.

    Get Your 300+ High Quality DoFollow Backlinks Here!

    Order Now with Full Confidence & 100% satisfaction.

    ОтветитьУдалить
  68. Very nice blog.We are the Best Digital Marketing Agency in Chennai, Coimbatore, Madurai and change makers of digital! For Enquiry Contact us @+91 9791811111

    Website designers in chennai | digital marketing agencies in chennai |digital marketing consultants in chennai | Best seo company in chennai | Best SEO Services in Chennai

    ОтветитьУдалить
  69. great poster.We are the Best Digital Marketing Agency in Chennai, Coimbatore, Madurai and change makers of digital! For Enquiry Contact us @+91 9791811111

    Website designers in chennai | digital marketing agencies in chennai |digital marketing consultants in chennai | Best seo company in chennai | Best SEO Services in Chennai

    ОтветитьУдалить
  70. Great Post! it is very helpful for me and all for those who want to learn. Dot Net Training

    ОтветитьУдалить
  71. Very Nice Detail And Good Article Thanks for posting .wonderful great blog. We offer the most budget-friendly quotes on all your digital requirements. We are available to our clients when they lookout for any help or to clear queries.

    Best SEO Services in Chennai | digital marketing agencies in chennai | Best seo company in chennai | digital marketing consultants in chennai | Website designers in chennai

    ОтветитьУдалить
  72. Forex Signals, MT4 and MT5 Indicators, Strategies, Expert Advisors, Forex News, Technical Analysis and Trade Updates in the FOREX IN WORLD

    Forex Signals Forex Strategies Forex Indicators Forex News Forex World

    ОтветитьУдалить
  73. I was able to find good information from your blog articles.I have express a few of the articles on your website now, and I really like your style of blogging. I added it to my favorite’s blog site list and will be checking back soon…That being said, I think most devs would prefer entity substitution over a literal line break, but I suppose I'll take it any way I can get it.Java training in Chennai

    Java Online training in Chennai

    Java Course in Chennai

    Best JAVA Training Institutes in Chennai

    Java training in Bangalore

    Java training in Hyderabad

    Java Training in Coimbatore

    Java Training

    Java Online Training

    ОтветитьУдалить
  74. Thanks for sharing it.I got Very valuable information from your blog.your post is really very Informatve. I got Very valuable information from your blog.I’m satisfied with the information that you provide for me.


    angular js training in chennai

    angular training in chennai

    angular js online training in chennai

    angular js training in bangalore

    angular js training in hyderabad

    angular js training in coimbatore

    angular js training

    angular js online training

    ОтветитьУдалить
  75. Thanks for sharing an informative blog keep rocking bring more details.I like the helpful info you provide in your articles. I’ll bookmark your weblog and check again here regularly.I need to to thank you for your time due to this fantastic read!! I definitely enjoyed every bit of it and I have you bookmarked to see new information on your blog.
    DevOps Training in Chennai

    DevOps Online Training in Chennai

    DevOps Training in Bangalore

    DevOps Training in Hyderabad

    DevOps Training in Coimbatore

    DevOps Training

    DevOps Online Training

    ОтветитьУдалить
  76. Thanks for sharing an informative blog keep rocking bring more details.I like the helpful info you provide in your articles. I’ll bookmark your weblog and check again here regularly. keep up!!!


    Android Training in Chennai

    Android Online Training in Chennai

    Android Training in Bangalore

    Android Training in Hyderabad

    Android Training in Coimbatore

    Android Training

    Android Online Training

    ОтветитьУдалить
  77. Thank you for sharing such a great information.Its really nice and informative.hope more posts from you. I also want to share some information recently i have gone through and i had find the one of the best mule esb training videos
    acte chennai

    acte complaints

    acte reviews

    acte trainer complaints

    acte trainer reviews

    acte velachery reviews complaints

    acte tambaram reviews complaints

    acte anna nagar reviews complaints

    acte porur reviews complaints

    acte omr reviews complaints

    ОтветитьУдалить
  78. I like your post. Everyone should do read this blog. Because this blog is important for all now I will share this post. Thank you so much for share with us.

    AWS Training in Hyderabad

    ОтветитьУдалить
  79. Thanks for provide great informatics and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once again

    AWS Training in Hyderabad

    ОтветитьУдалить
  80. Nice to be seeing your site once again, it's been weeks for me. This article which ive been waited for so long. I need this guide to complete my mission inside the school, and it's same issue together along with your essay.

    python training in bangalore

    python training in hyderabad

    python online training

    python training

    python flask training

    python flask online training

    python training in coimbatore


    ОтветитьУдалить
  81. Good Post! , it was so good to read and useful to improve my knowledge as an updated one, keep blogging.After seeing your article I want to say that also a well-written article with some very good information which is very useful for the readers....thanks for sharing it and do share more posts like this.
    https://www.3ritechnologies.com/course/microsoft-azure-training-in-pune/

    ОтветитьУдалить
  82. Good Post! , it was so good to read and useful to improve my knowledge as an updated one, keep blogging. After seeing your article I want to say that also a well-written article with some very good information which is very useful for the readers....thanks for sharing it and do share more posts like this.
    https://www.3ritechnologies.com/course/microsoft-azure-training-in-pune/

    ОтветитьУдалить
  83. Excellent work,Thanks for provide a great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would request, wright more blog and blog post like that for us. Thanks you once agian

    ОтветитьУдалить
  84. Machine Learning Courses I really enjoy reading and also appreciate your work. I read that Post and got it fine and informative. Please share more like that...
    Cool stuff you have, and you keep overhaul every one of us.

    ОтветитьУдалить
  85. Thank you a lot for providing individuals with a very spectacular possibility to read critical reviews from this site.

    Data Science Training in Hyderabad

    ОтветитьУдалить
  86. I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously
    in their life, he/she can earn his living by doing blogging.Thank you for this article.
    tibco sportfire online training

    ОтветитьУдалить
  87. Nice post!

    Worried About QuickBooks Error ?Get in touch with QuickBooks expert for instant solution.
    Click Here to know how to fix QuickBooks Error 8007

    Dial on QuickBooks Error Phone Number +1-855-977-7463.

    ОтветитьУдалить
  88. Sometimes it’s become so hard to buy a new phone when you have a little money. But it’s very urgent to buy a mobile phone. Then you should search for a second hand mobile phone market for sale in various classified ads platforms in your area or Quikads. By this you could fill up your needs.

    ОтветитьУдалить

  89. Dr. Vivek Galani is a leading expert in skin and hair. At hair transplant clinic in Surat Skin Care, Cosmetic Laser, Hair Transplant & Slimming Center, Dr. Galani offers the most advanced cosmetic and dermatologic care treatments. The clinic uses advanced FUE methods to produce high-quality hair transplants.

    ОтветитьУдалить
  90. Nice Blog !
    QuickBooks Error 248 can occur when a user tries to run payroll for the employees. You may also encounter this issue when you are taking a backup of your company file.call us and get the best possible solutions to resolve QuickBooks Error 248.

    ОтветитьУдалить
  91. Thank you for sharing this valuable content.
    I love your content it's very unique.
    DigiDaddy World

    ОтветитьУдалить
  92. asp.net white space has turned into an advertising space :)

    ОтветитьУдалить
  93. Hey! Lovely blog. Your blog contains all the details and information related to the topic. In case you are a QuickBooks user, here is good news for you. You may encounter any error like QuickBooks Error, visit at QuickBooks Customer Service Phone Number for quick help.

    ОтветитьУдалить
  94. Amazing, glad to see this great post. I trust this think help any beginner for their amazing work. By the way a debt of gratitude is in order for share this magnificence from…

    Data Science Training in Hyderabad

    ОтветитьУдалить
  95. I would like to take this opportunity to thank the author for his incredible work. I believe Customer relationship management is essential for every business to create a loyal customer base.
    Top CRM Software

    ОтветитьУдалить
  96. It was a wonderful chance to visit this kind of site and I am happy to know. Thank you so much for giving us a chance to have this opportunity..
    data analytics courses in hyderabad

    ОтветитьУдалить
  97. Как поступить гадание онлайн бесплатно - это обыденный порядок узнать судьбу с использованием различных объектов и приемов. Комплекс воздействий, ориентированных на предвидение судьбы, именуют хиромантия. Сверхъестественные силы и всякие положения хиромантии наукой не доказаны, но многочисленные люди доверяют подобному.

    ОтветитьУдалить
  98. Good information and informative content. Keep posting more blogs with us. Thank you.
    Data Science Course in Hyderabad

    ОтветитьУдалить
  99. Clearing the whitespace was very difficult, but now i did that with ASP.Net, thanks for the tip. Meanwhile refer
    Digital marketing courses in Delhi
    for details about Online Digital marketing courses.

    ОтветитьУдалить
  100. Hi, I am thankful for this useful blog post. It's really helpful. If you are interested in learning digital marketing, here is a complete list of the best online digital marketing courses with certifications. In this article, you will learn about digital marketing and its different strategies, the need for doing digital marketing, the scope of digital marketing, career opportunities after doing online digital marketing, and many more.
    Visit-
    Online Digital Marketing Courses

    ОтветитьУдалить
  101. A very informative article for programmers. Very hard work done to write such informative blogs. Thank you very much for sharing. For more information please visit at Digital marketing courses in france

    ОтветитьУдалить
  102. Hi, Nice blog post. I found this blog very informative and useful. If you are interested in learning digital marketing, here is a list of the top 13 digital marketing courses in Ahmedabad with placements. This article will help you decide which institute is best for you to learn digital marketing and will help you to become an efficient and productive digital marketer.
    Visit- Digital Marketing Courses in Ahmedabad

    ОтветитьУдалить
  103. Great article on .Net and ASP.NET. very powerful language and widely used for web development. Thanks for sharing the informative and educational piece of content. If anyone wants to learn Digital Marketing, Please join the highly demanded and most sought skill by the professionals in all streams due to the remarkable growth predicted by international survey agencies. So join today. Find out more detail at
    Digital marketing courses in france

    ОтветитьУдалить
  104. Nice blog! Keep updating with this type of information. It's really helpful. If you are interested in building a medical career but are struggling to clear medical entrance exams, Wisdom Academy is the right place to begin. It is one of Mumbai's best NEET coaching institutes for students preparing for medical and other competitive-level entrance examinations. The academy caters to home and group tuitions for NEET by professionals. It offers comprehensive learning resources, advanced study apparatus, doubt-clearing sessions, regular tests, mentoring, expert counseling, and much more. Enroll Now!
    NEET Coaching in Mumbai

    ОтветитьУдалить
  105. Этот комментарий был удален автором.

    ОтветитьУдалить
  106. Thank you for sharing this useful blog on your finding on .NET as well as the beneficial thoughts. I would also like to share this blog on the SEM in the field of Digital Marketing. beneficial to use in the field of marketing. To know more visit -
    Search Engine Marketing

    ОтветитьУдалить
  107. I always appreciate this kind of content which helps a learner like me a lot. Thank you for sharing. One can also have a look on Digital Marketing Courses in Abu Dhabi

    ОтветитьУдалить
  108. Nice post. Thanks for sharing! I want people to know just how good this information is in your article. It’s interesting content and Great work.

    for Affordable Interior Designer In Gurgaon
    visit - lookobeauty
    https://lookobeauty.com/best-interior-designer-in-gurgaon/

    ОтветитьУдалить
  109. Thanks so much for sharing your knowledge in this blog. This is a valuable source of information that will help many people. Because we can not stop learning, we provide Digital Marketing Courses in Delhi to help people to understand the power of Digital marketing. Please read here:
    Digital Marketing Courses in Delhi

    ОтветитьУдалить
  110. Hi, This log is truly an educational blog. The formatting is well done with usage of simple words which can be easily understood by the readers. I have bookmarked this blog for future references. Thank you.
    Digital marketing courses in Ghana

    ОтветитьУдалить
  111. Looking For Best Makeup Artist Course In Gurgaon. Best Makeup Artist Institute With Affordable Fees, Best Placement Record By Top Makeup Teachers In Gurgaon.

    ОтветитьУдалить