Eilon Lipton's Blog

Technical blog on Microsoft ASP.NET (and AJAX and MVC).

  • Last GUID used up - new ScottGuID unique ID to replace it

    You might have heard in recent news that the last ever GUID was used up. The GUID {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF} was just consumed by a soon to be released project at Microsoft. Immediately after the GUID's creation the word spread around the Microsoft campuses around the globe. Microsoft's approximately 100,000 worldwide employees then started blogging, tweeting, and facebooking about the dubious "achievement." The following screenshot shows GUIDGEN (the Windows tool for creating GUIDs) with the last ever GUID.

    Read more...

  • Migrating ASP.NET MVC 1.0 applications to ASP.NET MVC 2 RTM

    ASP.NET MVC 2 RTM has just been released! More info on ScottGu's blog.

    I have updated the MVC App Converter to convert projects from ASP.NET MVC 1.0 to ASP.NET MVC 2 RTM.

    This should be last the last major change to the MVC App Converter that I released previews of in the past several months.

    MVC App Converter screen shot

    Download

    The app is a single executable: Download MvcAppConverter-MVC2RTM.zip (255 KB).

    Usage

    The only requirement for this tool is that you have .NET Framework 3.5 SP1 on the machine. You do not need to have Visual Studio or ASP.NET MVC installed (unless you want to open your project!). Even though the tool performs an automatic backup of your solution it is recommended that you perform a manual backup of your solution as well.

    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2008 perform these steps:
      • Launch the converter
      • Select the solution
      • Click the “Convert” button
    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2010:
      • Wait until Visual Studio 2010 is released (next month!) and it will have a built-in version of this tool that will run automatically when you open an ASP.NET MVC 1.0 project
      • Perform the above steps, then open the project in Visual Studio 2010 and it will perform the remaining conversion steps

    What it can do

    • Open up ASP.NET MVC 1.0 projects from Visual Studio 2008 (no other versions of ASP.NET MVC or Visual Studio are supported)
    • Create a full backup of your solution’s folder
    • For every VB or C# project that has a reference to System.Web.Mvc.dll it will (this includes ASP.NET MVC web application projects as well as ASP.NET MVC test projects):
      • Update references to ASP.NET MVC 2
      • Add a reference to System.ComponentModel.DataAnnotations 3.5 (if not already present)
    • For every VB or C# ASP.NET MVC Web Application it will:
      • Change the project type to an ASP.NET MVC 2 project
      • Update the root ~/web.config references to ASP.NET MVC 2
      • Update the root ~/web.config to have a binding redirect from ASP.NET MVC 1.0 to ASP.NET MVC 2
      • Update the ~/Views/web.config references to ASP.NET MVC 2
      • Add or update the JavaScript files (add jQuery, add jQuery.Validate, add Microsoft AJAX, add/update Microsoft MVC AJAX, add Microsoft MVC Validation adapter)
    • Unknown project types or project types that have nothing to do with ASP.NET MVC will not be updated

    What it can’t do

    • It cannot convert projects directly to Visual Studio 2010 or to .NET Framework 4.
    • It can have issues if your solution contains projects that are not located under the solution directory.
    • If you are using a source control system it might have problems overwriting files. It is recommended that before converting you check out all files from the source control system.
    • It cannot change code in the application that might need to be changed due to breaking changes between ASP.NET MVC 1.0 and ASP.NET MVC 2.

    Feedback, Please!

    If you need to convert a project to ASP.NET MVC 2 please try out this application and hopefully you’re good to go. If you spot any bugs or features that don’t work leave a comment here and I will try to address these issues in an updated release.

    Read more...

  • Migrating ASP.NET MVC 1.0 applications to ASP.NET MVC 2 Beta (updated!)

    NOTE: There is an updated version of this tool that is compatible with ASP.NET MVC 2 RTM. 

    Thanks to the great feedback I’ve received on my ASP.NET MVC conversion tool for ASP.NET MVC 2 Preview 2 I’ve updated it to support conversions to ASP.NET MVC 2 Beta. I’ve included a number of bugs fixes and improvements based on the feedback:

    1. The JavaScript files have been updated to be compatible with ASP.NET MVC 2 Beta
    2. A “Scripts” folder will be automatically created if one does not already exist
    3. References to the System.Web.Mvc.dll assembly will be updated to use the fully-qualified name (public key token, etc.)
    4. UI improvements

    ASP.NET MVC Solution Converter

    Download

    The app is a single executable: Download MvcAppConverter.zip (226 KB).

    Usage

    The only requirement for this tool is that you have .NET Framework 3.5 SP1 on the machine. You do not need to have Visual Studio or ASP.NET MVC installed (unless you want to open your project!). Even though the tool performs an automatic backup of your solution it is recommended that you perform a manual backup of the solution as well.

    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2008 perform these steps:
      • Launch the converter
      • Select the solution
      • Click the “Convert” button
    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2010:
      • Perform the above steps, then open the project in Visual Studio 2010 and it will perform the remaining conversion steps

    What it can do

    • Open up ASP.NET MVC 1.0 projects from Visual Studio 2008 (no other versions of ASP.NET MVC or Visual Studio are supported)
    • Create a full backup of your solution’s folder
    • For every VB or C# project that has a reference to System.Web.Mvc.dll it will (this includes ASP.NET MVC web application projects as well as ASP.NET MVC test projects):
      • Update references to ASP.NET MVC 2
      • Add a reference to System.ComponentModel.DataAnnotations 3.5 (if not already present)
    • For every VB or C# ASP.NET MVC Web Application it will:
      • Change the project type to an ASP.NET MVC 2 project
      • Update the root ~/web.config references to ASP.NET MVC 2
      • Update the root ~/web.config to have a binding redirect from ASP.NET MVC 1.0 to ASP.NET MVC 2
      • Update the ~/Views/web.config references to ASP.NET MVC 2
      • Add or update the JavaScript files (add jQuery, add jQuery.Validate, add Microsoft AJAX, add/update Microsoft MVC AJAX, add Microsoft MVC Validation adapter)
    • Unknown project types or project types that have nothing to do with ASP.NET MVC will not be updated

    What it can’t do

    • It cannot convert projects directly to Visual Studio 2010 or to .NET Framework 4.
    • It can have issues if your solution contains projects that are not located under the solution directory.
    • If you are using a source control system it might have problems overwriting files. It is recommended that before converting you check out all files from the source control system.
    • It cannot change code in the application that might need to be changed due to breaking changes between ASP.NET MVC 1.0 and ASP.NET MVC 2. Consult the readme for information on breaking changes.

    Feedback, Please!

    If you need to convert a project to ASP.NET MVC 2 please try out this application and hopefully you’re good to go. If you spot any bugs or features that don’t work leave a comment here and I will try to address these issues in an updated release.

    Read more...

  • Migrating ASP.NET MVC 1.0 applications to ASP.NET MVC 2

    NOTE: There is an updated version of this tool that is compatible with ASP.NET MVC 2 RTM.

    To help our customers adopt ASP.NET MVC 2 I built an application that helps upgrade Visual Studio 2008 solutions that use ASP.NET MVC 1.0 to use ASP.NET MVC 2 Preview 2. This application is inspired by Scott Hanselman’s blog post on updating ASP.NET MVC projects to work in Visual Studio 2010 Beta 1.

    image

    Download

    The app is a single executable: Download MvcAppConverter.zip (220 KB).

    Usage

    The only requirement for this tool is that you have .NET Framework 3.5 SP1 on the machine. You do not need to have Visual Studio or ASP.NET MVC installed (unless you want to open your project!). Even though the tool performs an automatic backup of your solution it is recommended that you perform a manual backup of the solution as well.

    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2008 perform these steps:
      • Launch the converter
      • Select the solution
      • Click the “Convert” button
    • To convert an ASP.NET MVC 1.0 project built with Visual Studio 2008 to an ASP.NET MVC 2 project in Visual Studio 2010:
      • Perform the above steps, then open the project in Visual Studio 2010 and it will perform the remaining conversion steps

    What it can do

    • Open up ASP.NET MVC 1.0 projects from Visual Studio 2008 (no other versions of ASP.NET MVC or Visual Studio are supported)
    • Create a full backup of your solution’s folder
    • For every VB or C# project that has a reference to System.Web.Mvc.dll it will (this includes ASP.NET MVC web application projects as well as ASP.NET MVC test projects):
      • Update references to ASP.NET MVC 2
      • Add a reference to System.ComponentModel.DataAnnotations 3.5 (if not already present)
    • For every VB or C# ASP.NET MVC Web Application it will:
      • Change the project type to an ASP.NET MVC 2 project
      • Update the root ~/web.config references to ASP.NET MVC 2
      • Update the root ~/web.config to have a binding redirect from ASP.NET MVC 1.0 to ASP.NET MVC 2
      • Update the ~/Views/web.config references to ASP.NET MVC 2
      • Add or update the JavaScript files (add jQuery, add jQuery.Validate, add Microsoft AJAX, add/update Microsoft MVC AJAX, add Microsoft MVC Validation adapter)
    • Unknown project types or project types that have nothing to do with ASP.NET MVC will not be updated

    What it can’t do

    • It cannot convert projects directly to Visual Studio 2010 or to .NET Framework 4.
    • It can have issues if your solution contains projects that are not located under the solution directory.
    • If you are using a source control system it might have problems overwriting files. It is recommended that before converting you check out all files from the source control system.
    • It cannot change code in the application that might need to be changed due to breaking changes between ASP.NET MVC 1.0 and ASP.NET MVC 2. Consult the readme for information on breaking changes.

    Feedback, Please!

    If you need to convert a project to ASP.NET MVC 2 please try out this application and hopefully you’re good to go. If you spot any bugs or features that don’t work leave a comment here and I will try to address these issues in an updated release.

    Read more...

  • The String or the Cat: A New .NET Framework Library

    For years applications have been built that accept user input. Most user input starts out as a string. Strings are a universal representation of arbitrary data coming into a computer. However, most data does not remain as a string for very long. User input often ends up getting parsed or converted into another data type, such as an integer, Boolean value, or a date.

    The concepts presented here are based on a thought experiment proposed by scientist Erwin Schrödinger. While an understanding of quantum physics will help to understand the new types and APIs, it is not required.

    clip_image002

    Mutation of data types leaves a software developer in an interesting situation if the data was not formatted properly and thus could not be mutated. For example, the string “abc123” cannot be parsed into an integer. Many frameworks deal with this situation by immediately reporting an error condition. That error could be an exception that was thrown or a Boolean value of false to indicate failure. Keeping track of these states can easily introduce uncertainty into an application.

    StringOr<TOther>

    The first class being introduced is the StringOr class. It is a generic class that encapsulates both the original string user input as well as the result of an attempted conversion operation.

    namespace System.QuantumEntanglement {
        public class StringOr<TOther> {
            public StringOr(string stringValue, TOther otherValue);
    
            public string StringValue { get; }
            public TOther OtherValue { get; }
        }
    }

    The usage of the StringOr class is quite simple. An API that wishes to return data that might not have been parsed successfully can use the StringOr class to represent the dual state of its return value.

    For example, a typical application might have a TextBox for entering an integer quantity:

    clip_image004

    If the consumer of this API wants the original value, they can use the StringValue property. Otherwise they can use the OtherValue property, which in this case is the successfully parsed integer.

    The following diagram illustrates the dichotomy with a scenario familiar to many physicists:

    clip_image006

    SchrodingOr<TDead, TAlive>

    The second class being introduced is the SchrodingOr class. It is similar to the StringOr, but with a distinct difference regarding its states. The SchrodingOr can represent any two data types: It is not restricted to one of the types being a string.

    namespace System.QuantumEntanglement {
        public class SchrodingOr<TDead, TAlive> {
            public SchrodingOr(TDead dead, TAlive alive);
    
            public TAlive Alive { get; }
            public TDead Dead { get; }
        }
    }

    The usage of the SchrodingOr class is also similar to the StringOr. An API that wishes to return data that might be either of two data types, but never both data types at the same time, can return a SchrodingOr. The following code sample demonstrates a case where an API returns a value that can be either a bool or a DateTime.

    clip_image008

    Depending on the effects of quantum mechanics one of the two properties will return its value, while the other will throw a HeisenburgException. As before, the following diagram illustrates the dichotomy of the two possible values:

    clip_image010

    System.QuantumEntanglement Community Technology Preview

    While the new .NET Framework library is still in relatively early stages of development, the team has decided to release a sneak preview to get feedback from our users. The link below contains the full source code for the new library, as well as unit tests that demonstrate proper usage of the libraries.

    Please send all questions, comments, and suggestions to string.or@microsoft.com.

    Many thanks,

    The .NET Framework Quantum Mechanics Team

    Read more...

  • ASP.NET MVC Release Candidate 2: I declare myself to be declarative!

    Today is a happy day: we released ASP.NET MVC Release Candidate 2. We're getting ever-so-close to the final (RTM/RTW) release of ASP.NET MVC - it won't be long! We think we fixed all the highest priority issues so that everyone out there can build ASP.NET MVC applications without worrying that we're going to make some sudden changes that will break you. Please see Phil's blog post announcing the release.

    In this blog post I'll introduce you to a feature that's not even part of the main ASP.NET MVC download. It's part of the separate MVC Futures download, which includes prototypes of features that we're thinking of including in a future version of ASP.NET MVC.

    Introduction to the MVC Controls

    Before we dig into the details, let's create a simple ASP.NET MVC application that uses the MVC Controls.

    1. Download the MVC Futures binary from CodePlex.

    2. Create a new MVC Web Application Project (if asked, feel free to not create a unit test project). Please note that you must have Release Candidate 2 installed. Each release of ASP.NET MVC has a matching release of MVC Futures. Mixing releases is not supported and usually doesn't work.

    01-NewProject

    3. Add a reference to the MVC Futures binary. Right-click on the References node in Solution Explorer and choose "Add Reference". Select the "Browse" tab and navigate to the location to which you saved Microsoft.Web.Mvc.dll, select the file, and select OK.

    02-AddReference

    03-References

    4. Edit the web.config in the root of the application to include tag mappings to the MVC Futures namespace. This tells the ASP.NET parser where to locate the controls when you type in an <mvc:SomeControl> tag. There should already be some tag mappings listed - the only new tag mapping is the third one with "mvc" as the tag prefix.

    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add tagPrefix="mvc" namespace="Microsoft.Web.Mvc.Controls" assembly="Microsoft.Web.Mvc"/>
      </controls>
      ...

    5. Start using the controls!

    Let's start out with a simple scenario of updating some of the Account and Membership features of the default template to use the MVC Controls.

    1. Open up the ~/Views/Account/LogOn.aspx view page. The markup there should include this text box:

    <%= Html.TextBox("username") %>

    2. Change the text box markup to use the MVC TextBox control:

    <mvc:TextBox runat="server" Name="username" />

    (Please note that it sometimes takes Visual Studio a few moments to recognize new tag mappings. If Intellisense doesn't show up, please just give it a minute.)

    3. Run the application and click "Log On" at the top-right of the page.

    04-Login

    4. If all is well, the page should continue to have the exact same behavior as before. For example, if you immediately click "Log On" without typing in a username or password you should see the red highlight on the text box indicating an error.

    05-errors

    The idea of the MVC Controls is that they are largely modeled after the HtmlHelpers, and thus try to preserve all their behavior. This includes naming conventions, the markup they render, and usage of model state.

    Advanced MVC Controls

    For a more advanced scenario involving the MVC Controls I'd like to introduce the MVC Repeater control. In many ways it is very similar to the ASP.NET Repeater control, but the main difference is of course that the MVC Repeater has specific knowledge of ViewData.

    1. In the application you already created, open ~/Controllers/HomeController.cs (Sorry, I don't have a VB sample!) and add this new action method and two classes:

    public ActionResult ProductList() {
        List<Distributor> distributors = new List<Distributor> {
            new Distributor { DistributorID = 501, Name = "Joe's Shop", Location = "Redmond, WA" },
            new Distributor { DistributorID = 502, Name = "Jill's Shop", Location = "Los Angeles, CA" },
            new Distributor { DistributorID = 503, Name = "Jeremy's Shop", Location = "Boston, MA" },
        };
    
        List<Product> products = new List<Product> {
            new Product {
                ProductID = 1001, 
                Name = "LEGO Technic Off Roader", 
                UnitPrice = 119.99m,
                Distributors = new List<Distributor> { distributors[0], distributors[1] } },
            new Product { 
                ProductID = 1002, 
                Name = "Ferrari F430", 
                UnitPrice = 189000m, 
                Distributors = new List<Distributor> { distributors[0], distributors[1], distributors[2] } },
            new Product { 
                ProductID = 1003, 
                Name = "Five bedroom house in Bellevue, WA",
                UnitPrice = 540000m, 
                Distributors = new List<Distributor> { } },
            new Product { 
                ProductID = 1004, 
                Name = "Dell 2007FP LCD monitor", 
                UnitPrice = 439m,
                Distributors = new List<Distributor> { distributors[2] } },
        };
    
        ViewData["products"] = products;
    
        return View();
    }
    
    public class Product {
        public int ProductID { get; set; }
        public string Name { get; set; }
        public decimal UnitPrice { get; set; }
        public IEnumerable<Distributor> Distributors { get; set; }
    }
    
    public class Distributor {
        public int DistributorID { get; set; }
        public string Name { get; set; }
        public string Location { get; set; }
    }

    2. Right-click anywhere in the action method and choose Add View with the default options and select "Add":

    06-addview

    3. In the newly created view add this ASPX markup to the second content placeholder (right below the <h2> tag):

    <mvc:Repeater runat="server" Name="products">
        <ItemTemplate>
            <b><mvc:Label runat="server" Name="Name" /></b>
            (PID#<mvc:Label runat="server" Name="ProductID" />)
            $<mvc:Label runat="server" Name="UnitPrice" /><br />
            Distributors:<br />
            <mvc:Repeater runat="server" Name="distributors">
                <ItemTemplate>
                    - <b><mvc:Label runat="server" Name="Name" /></b>
                    (DID#<mvc:Label runat="server" Name="DistributorID" />),
                    located in <mvc:Label runat="server" Name="Location" /><br />
                </ItemTemplate>
                <EmptyDataTemplate>
                    - Sorry, there are no distributors for this item<br />
                </EmptyDataTemplate>
            </mvc:Repeater>
            <br />
        </ItemTemplate>
    </mvc:Repeater>
    Please note that when you paste in the code Visual Studio might add an "ID" attribute to every control tag. You can delete all those attributes if you don't want them - but it's fine to leave them.

    4. Run the page and you will get this nested databound rendering:

    07-rendering

    Advantages of MVC Controls Over Code Nuggets

    If you've used the default WebFormViewEngine in ASP.NET MVC, you've certainly used this syntax somewhere in your views:

    <%= Html.TextBox("FirstName") %>

    What you might not know is that this syntax is called a "code nugget." While there is nothing inherently wrong with using code nuggets, one advantage of using MVC Controls is that they can provide a rich design-time experience. Many developers, even those who are familiar with the intricacies of HTML and CSS, like to get an accurate preview of what their page will look like without running the application.

    If you've used ASP.NET Web Forms and controls such as the SqlDataSource and the GridView, you've seen how rich a design-time experience can be. Those controls include design time rendering previews, advanced template editing, and even wizards that walk you through the steps of configuring the controls.

    The MVC Controls in the MVC Futures download are just a start: they certainly don't have the fit and finish that is seen in the SqlDataSource design-time experience. Like many rumors about ASP.NET MVC itself have stated, the beginnings of the MVC Controls were in fact written on an airplane!

    Compare the areas in the following screen shot of the text box we created earlier to see the difference. The MVC Control has a proper preview, whereas the HTML Helper doesn't render at all.

    08-DesignView

    Disadvantages of MVC Controls

    One of the biggest disadvantages of the MVC Controls is that there is a rather immediate limit to how you can use them. For example, take this relatively simple scenario with the regular TextBox HtmlHelper:

    <%= Html.TextBox("FirstName", Model.FirstName.ToUpper()) %>

    There is no simple way to do this with the MVC Controls because there is no place to add your own code to pre-process the values.

    Another disadvantage is that the MVC Controls work only with the WebFormViewEngine. There are several other view engines out there that people have been using with ASP.NET MVC. Some of the popular third party view engines out there are Spark view engine, NHaml, and the view engines included in the MVC Contrib project, which are Brail, NVelocity, and XSLT.

    For ASP.NET MVC 1.0 we decided on the MVC team to focus our efforts on features that have the widest possible benefit. In this case it meant writing helpers that worked with as many different view engines as possible.

    As a slight bit of humor (though it's in fact serious), please refer to Eric Lippert's blog post How many Microsoft employees does it take to change a lightbulb?

    The Future of the MVC Controls

    As I mentioned in the top of the post, the MVC Controls are just a prototype. They are not complete; they are not set in stone; and there is no guarantee that they will ever be part of the main ASP.NET MVC download.

    I already have a long list of improvements to make to the MVC Controls. I plan to add many more controls as well as more advanced features to existing controls.

    If you have any feedback, comments, or suggestions on the MVC Controls feel free to post them here. We take all feedback seriously!

    Some questions to think about:

    1. Do you see yourself using the MVC Controls?
      • If so, why?
      • If not, why not?
    2. What MVC Controls would you see yourself using the most? (Even ones that don't exist yet.)

    Read more...