skip to content
  • 16 June 2013

    Three Steps to Get Fat-Razor MVC Views on Diet

    Fat Razor in MVC

    Let me first define the terms that I will be referring to:

    Presentation Code: Is the minimal code in a view that is necessary to display visual elements, but does not take any business decision. This is a fictional simple example:

        // Business Logic Code. This code understands how the business works
        // (don't do this)
        @if (Model.IsMonthly && !Model.IsPaid && Model.Payment >= 12 && ...)
        {
    	    <p>Some warning message</p>
        }
        
        // Presentation Code. This code is only concerned with whether to
        // show or hide a UI element.
        @if (Model.ShouldWarn)
        {
    	    <p>Some warning message</p>
        }
    

    Fat-Razor: I’ve coined this term to define ASP.NET Razor views with a lot of Razor/C# code that is not presentation code. This is about the Razor/C# code specifically and not about HTML/CSS/JS.

    Model: This is an overloaded term. However, in this context, it is an object of data representation such as a record in the database.

    Viewmodel: They are data transfer objects that are meant to be view-specific and to carry exactly what the view needs, no less and no more. Generally, viewmodels are non-reusable and each vm is meant to to be tightly coupled to one view, however, there are exceptions depending on what you are doing.

    To give you a flavour of a model and a viewmodel:

    // An example of a model
    public class Person
    {
        public Guid PersonId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public short YearOfBirth { get; set; }
        public DateTime LastAuth { get; set; }
        // This might represent a one-to-many db relationship
        public Order[] Orders { get; set; }
    }
    
    // An example of a viewmodel
    public class ProfileViewModel
    {
        // Doesn't necessarily need an id
    
        // Combined first and last name
        public string Name { get; set; }
        // Calculated from YearOfBirth
        public short Age { get; set; }
        // E.g. "One day ago" and constructed from LastAuth
        public string LastSeen { get; set; }
        // Calculated by projections on Orders
        public short NumberOfAllOrders { get; set; }
        public short NumberOfUndeliveredOrders { get; set; }
    }
    

    Read the rest of this entry »