Tuesday, September 1, 2015

Check If username/email already registered using Remote Validation attribute in asp.net mvc

When we create Registration form on a web application, we have to check that the email address and username that user is entering is unique and is not already. In asp.net mvc we have Validation Attribute feature in under System.ComponentModel.DataAnnotations and System.Web.Mvc which we can use for different type of Validations before sending data to be saved in persistent location.

In System.Web.Mvc we have Remote attribute which is available in asp.net mvc 4 in which i am implementing it for  this post, i am not sure if it is available in the earlier version of asp.net mvc.


So i have this ViewModel:


public class SignUpViewModel
    {
        
        public int UserID { get; set; }

        [Required(ErrorMessage = "First Name is required")]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "Last Name is Required")]
        public string LastName { get; set; }

        [Required(ErrorMessage = "Username is Required")]
        [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "user name must be combination of letters and numbers only.")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "Password is Required")]
        public string Password { get; set; }

        [Required(ErrorMessage = "Password is Required")]
        [System.Web.Mvc.Compare("Password",ErrorMessage="Both Password fields must match.")]
        public string ConfirmPassword { get; set; }

        [Required(ErrorMessage = "Email Address is required")]
        [EmailAddress(ErrorMessage = "Invalid Email Address")]
        public string Email { get; set; }

As you can see there are laready attributes on the properties of ViewModel like Required which are mandatory fields, RegularExpression attribute for Email Address format validation and Compare attribute for comparing two properties values which is useful here for Password and Repeat Password textbox for making sure that user has verified what password he is setting.

Now what will happen if user enters a username or Email Address which is already registered, one way is to check in post action for username and Email Address  and show user error message that username or Email Address is already taken which does not looks though, as validation should be done before posting data to action using unobtrusive validtion.

Now here we will use Remote attribute which will check for both UserName and Email Address field, here is how it will be done:


 [Required(ErrorMessage = "Username is Required")]
 [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "user name must be combination of letters and numbers only.")]
 [Remote("UsernameExists","Account",HttpMethod="POST",ErrorMessage="User name already registered.")]
 public string UserName { get; set; }


[Required(ErrorMessage = "Email Address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
[Remote("EmailExists", "Account", HttpMethod = "POST", ErrorMessage = "Email address already registered.")]
 public string Email { get; set; }


Remote Attribute has different parameters to be specified:

  1. Action Name which will be called which will have input parameter for this property value
  2. Controller Name of which action will be executed
  3. HttpMethod (Get or Post)
  4. ErrorMessage (Error Message that will be displayed if validation fails)  
Let's come to the action part we need to write action method in the Account controller for Validation, for this post just for clearing to readers i am just checking for specific username and email (my name and dummy email address), but in your project you will need to check in your database for that particular criteria and return true or false respectively.


Here is the action code:


public JsonResult UsernameExists(string username)
{    
     return Json(!String.Equals(username,"ehsansajjad",StringComparison.OrdinalIgnoreCase));
}

public JsonResult EmailExists(string email)
{
     return Json(!String.Equals(email, "ehsansajjad@yahoo.com", StringComparison.OrdinalIgnoreCase));
}


Here is the complete View code:


@model CustomValidationMessageHelper.ViewModels.SignUpViewModel
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>SignUp</title>
    <link href="@Url.Content("~/Content/jquery.qtip.css")" rel="stylesheet" />

    <script src="@Url.Content("~/Scripts/jquery-1.9.1.js")"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.qtip.min.js")" type="text/javascript"></script>

</head>
<body>
    <div>
        @using (Html.BeginForm("SignUp", "Account", FormMethod.Post, new { @class = "form-inline", role = "form" }))
        {
          @Html.AntiForgeryToken()
    
    <div class="row">
        <div class="span8 offset5 aui-page-panel">

            <div>
                    <h2>Sign Up</h2>
                </div>
            <fieldset style="margin-bottom: 40px;">
                

                                <legend style="border-bottom: 1px solid gray; font-size: 16px;">Basic Information</legend>

                <table width="100%" border="0" cellspacing="0" cellpadding="0">
                    <tr id="tr_basic">
                        <td style="vertical-align: top;" width>
                            <div id="basicinfo" style="width: 100%">
                                <div style="height: auto !important; overflow-y: visible;">
                                    <table cellpadding="3">

                                        <tbody>
                                            <tr>
                                                <td width="150">
                                                    @Html.LabelFor(model => model.FirstName, new { @class = "sr-only" })
                                                </td>
                                                <td>
                                                    @Html.TextBoxFor(model => model.FirstName, new { @class = "form-control input-sm" })
                                                    @Html.ValidationMessageFor(model => model.FirstName)
                                                </td>

                                            </tr>
                                            <tr>
                                                <td>
                                                    @Html.LabelFor(model => model.LastName)
                                                </td>
                                                <td>
                                                    @Html.TextBoxFor(model => model.LastName, new { @class = "input-xsmall" })
                                                    @Html.ValidationMessageFor(model => model.LastName)
                                                </td>
                                            </tr>

                                            
                                            <tr>
                                            </tr>

                                        </tbody>
                                    </table>

                                </div>
                        </td>
                    </tr>

                </table>


                <legend style="border-bottom: 1px solid gray; font-size: 16px;">Account Information</legend>
                <table cellpadding="5">
                    <tr>
                        <td width="150">
                            @Html.LabelFor(model => model.UserName)
                        </td>
                        <td>
                            @Html.TextBoxFor(model => model.UserName)
                            @Html.ValidationMessageFor(model => model.UserName)
                        </td>
                        <td id="tdValidate">
                            <img id="imgValidating" src="@Url.Content("~/Images/validating.gif")" style="display:none;" /></td>

                    </tr>
                    <tr>
                        <td>
                            @Html.LabelFor(model => model.Password)
                        </td>
                        <td>
                            @Html.PasswordFor(model => model.Password)
                            @Html.ValidationMessageFor(model => model.Password)


                        </td>

                    </tr>


                    <tr>
                        <td>
                            @Html.LabelFor(m => m.ConfirmPassword, new { @class = "control-label" })
                        </td>

                        <td>
                            @Html.PasswordFor(model => model.ConfirmPassword)
                            @Html.ValidationMessageFor(model => model.ConfirmPassword)

                        </td>
                    </tr>
                    <tr>
                        <td>
                            @Html.LabelFor(m => m.Email, new { @class = "control-label" })
                        </td>

                        <td>
                            @Html.TextBoxFor(model => model.Email)
                            @Html.ValidationMessageFor(model => model.Email)


                        </td>

                    </tr>
                    <tr>
                    <td>
                        <p>
                            <div class="control-group">
                                <div class="controls">
                                    <input id="btnRegister" type="submit" class="btn btn-primary" value="Register" />
                                </div>
                            </div>

                        </p>
                    </td>
                    <td></td>
                </tr>
                </table>
    </div>
     </div>
            }
            </div>
        
</body>
</html>

Now when i will enter username "ehsansajjad" or Email Address "ehsansajjad@yahoo.com" validation will get fired that user already exists :





You can download the sample project from here.

Thursday, August 27, 2015

Mapping ViewModel to Model in asp.net mvc using implicit operator in C#

In asp.net mvc we have three important things in which we are moving all the time which is Model, View and Controller. Sometimes we want specific information of model to be passed from View to action, but if we use the Model classes that are mapped to our database tables make things messy, as all the model is round tripping from View to action or vice versa.


Consider the following model class which is mapped to the user table in my databse.


namespace JIRA.Domain.Models
{
    public class User
    {
        public int UserID { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public bool IsActive { get; set; }

        public bool IsDeleted { get; set; }

        public DateTime CreatedAt { get; set; }

        public int CreatedBy { get; set; }

        public DateTime UpdatedAt { get; set; }

        public int UpdatedBy { get; set; }

        public string Email { get; set; }
    }
}

Here is my database table :


CREATE TABLE [dbo].[tblUser] (
    [UserID]    INT           IDENTITY (1, 1) NOT NULL,
    [FirstName] NVARCHAR (25) NULL,
    [LastName]  NVARCHAR (25) NULL,
    [UserName]  NVARCHAR (25) NULL,
    [Password]  NVARCHAR (25) NULL,
    [IsActive]  BIT           NULL,
    [IsDeleted] BIT           NULL,
    [CreatedBy] INT           NULL,
    [CreatedAt] DATETIME      NULL,
    [UpdatedBy] INT           NULL,
    [UpdatedAt] DATETIME      NULL,
    [Email]     NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([UserID] ASC)
);


So what happens normally is developers strongly type their view with the model class that is mapped with the table in our db which is not a good approach, as our View don't needs all information of the table every time.

Now consider the scenario of Register/SignUp of user in which we have different fields form which some will map to the User class but as User is registering so some properties of Model are useless here which will be posted when user submits form and there are some properties that we may need additional but they are not mapped in the table, you can take example when user registers we take Password from user two times for Confirming, in that case we don't want to change our Model that represents our Entity in the database, so ViewModel comes in.

ViewModels are specific to the Views, we put information in View Model that we need on the particular View.Here is the snippet that  is not a preffered way,So now we will create a ViewModel for Register View which will have properties specific to that View that it needs to post and we will map the ViewModel properties to Entity Model that represents our table and will insert it in the database.



Here is the ViewModel:


namespace JIRA.ViewModels
{
    public class RegisterViewModel
    {
        public int UserID { get; set; }

        [Required(ErrorMessage = "First Name is required")]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "Last Name is Required")]
        public string LastName { get; set; }

        [Required(ErrorMessage = "Username is Required")]
        [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "user name must be combination of letters and numbers only.")]
        [Remote("UsernameExists","Account",HttpMethod="POST",ErrorMessage="User name already registered.")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "Password is Required")]
        public string Password { get; set; }

        [Required(ErrorMessage = "Password is Required")]
        [System.Web.Mvc.Compare("Password",ErrorMessage="Both Password fields must match.")]
        public string ConfirmPassword { get; set; }

        [Required(ErrorMessage = "Email Address is required")]
        [EmailAddress(ErrorMessage = "Invalid Email Address")]
        [Remote("EmailExists", "Account", HttpMethod = "POST", ErrorMessage = "Email address already registered.")]
        public string Email { get; set; }

    }
}

Now we will strongly type our View with the RegisterViewModel type:


@model JIRA.ViewModels.RegisterViewModel

using (Html.BeginForm("SignUp", "Account", FormMethod.Post, new { @class = "form-inline", role = "form" }))
        {
    @Html.AntiForgeryToken()
    
    <div class="row">
        <div class="span8 offset5 aui-page-panel">

            <div>
                    <h2>Sign Up</h2>
                </div>
            <fieldset style="margin-bottom: 40px;">
                

                                <legend style="border-bottom: 1px solid gray; font-size: 16px;">Basic Information</legend>

                <table width="100%" border="0" cellspacing="0" cellpadding="0">
                    <tr id="tr_basic">
                        <td style="vertical-align: top;" width>
                            <div id="basicinfo" style="width: 100%">
                                <div style="height: auto !important; overflow-y: visible;">
                                    <table cellpadding="3">

                                        <tbody>
                                            <tr>
                                                <td width="150">
                                                    @Html.LabelFor(model => model.FirstName, new { @class = "sr-only" })
                                                </td>
                                                <td>
                                                    @Html.TextBoxFor(model => model.FirstName, new { @class = "form-control input-sm" })
                                                    @Html.MyValidationMessageFor(model => model.FirstName)
                                                </td>

                                            </tr>
                                            <tr>
                                                <td>
                                                    @Html.LabelFor(model => model.LastName)
                                                </td>
                                                <td>
                                                    @Html.TextBoxFor(model => model.LastName, new { @class = "input-xsmall" })
                                                    @Html.MyValidationMessageFor(model => model.LastName)
                                                </td>
                                            </tr>
                                            @*<tr>
                                                <td>
                                                    @Html.LabelFor(model => model.Email)
                                                </td>
                                                <td>
                                                    @Html.TextBoxFor(model => model.Email, new { @class = "required" })
                                                    @Html.MyValidationMessageFor(model => model.Email)
                                                </td>
                                            </tr>*@
                                            
                                            <tr>
                                            </tr>

                                        </tbody>
                                    </table>

                                </div>
                        </td>
                    </tr>

                </table>


                <legend style="border-bottom: 1px solid gray; font-size: 16px;">Account Information</legend>
                <table cellpadding="5">
                    <tr>
                        <td width="150">
                            @Html.LabelFor(model => model.UserName)
                        </td>
                        <td>
                            @Html.TextBoxFor(model => model.UserName)
                            @Html.MyValidationMessageFor(model => model.UserName)
                        </td>
                        <td id="tdValidate">
                            <img id="imgValidating" src="@Url.Content("~/Images/validating.gif")" style="display:none;" /></td>

                    </tr>
                    <tr>
                        <td>
                            @Html.LabelFor(model => model.Password)
                        </td>
                        <td>
                            @Html.PasswordFor(model => model.Password)
                            @Html.MyValidationMessageFor(model => model.Password)


                        </td>

                    </tr>


                    <tr>
                        <td>
                            @Html.LabelFor(m => m.ConfirmPassword, new { @class = "control-label" })
                        </td>

                        <td>
                            @Html.PasswordFor(model => model.ConfirmPassword)
                            @Html.MyValidationMessageFor(model => model.ConfirmPassword)

                        </td>
                    </tr>
                    <tr>
                        <td>
                            @Html.LabelFor(m => m.Email, new { @class = "control-label" })
                        </td>

                        <td>
                            @Html.TextBoxFor(model => model.Email)
                            @Html.MyValidationMessageFor(model => model.Email)


                        </td>

                    </tr>
                    <tr>
                    <td>
                        <p>
                            <div class="control-group">
                                <div class="controls">
                                    <input id="btnRegister" type="submit" class="btn btn-primary" value="Register" />
                                </div>
                            </div>

                        </p>
                    </td>
                    <td></td>
                </tr>
                </table>





            </fieldset>
        </div>
    </div>

        }
    }

and our action would look like:


[HttpPost]
        [AllowAnonymous]
        public ActionResult SignUp(RegisterViewModel registerVM)
        {
            if (ModelState.IsValid)
            {
               // save to database
            }
          return View(registerVM);
        }

Our service method takes User type  object as input so we will have to convert RegisterViewModel object to User type object, a dirty way is to create a object of type User and map it to RegisterViewModel before calling service method which will cause code redudancy and will voilate DRY principle, a normal approach that beginner or intermediate developers do is:


[HttpPost]
        [AllowAnonymous]
        public ActionResult SignUp(RegisterViewModel registerVM)
        {
            if (ModelState.IsValid)
            {


                User user = new User
               {
                   FirstName = registerVM.FirstName,
                   LastName = registerVM.LastName,
                   UserName = registerVM.UserName,
                   Email = registerVM.Email,
                   Password = registerVM.Password
               };

                var result = authenticateService.RegisterUser(user);

As you can see every time we will have to pass data from action to service we will have to do this work  which is voilation of DRY principle as we will end up writing this stuff every where whereever we need to map object between DataModel and ViewModel.


Here comes in the implicit operator feature provide by c#, we will write our operator for RegisterViewModel and User type so that they can be implictly converted to each other where ever needed. We will have to modify the implementation of RegisterViewModel for this:

We will have to add these two operators in the RegisterViewModel class:


public static implicit operator RegisterViewModel(User user)
        {
            return new RegisterViewModel
            {
                UserID = user.UserID,
                FirstName = user.FirstName,
                UserName = user.UserName,
                Password = user.Password,
                ConfirmPassword = user.Password,
                Email = user.Email
            };
        }

        public static implicit operator User(RegisterViewModel vm)
        {
            return new User
            {
                FirstName = vm.FirstName,
                LastName = vm.LastName,
                UserName = vm.UserName,
                Email = vm.Email,
                Password = vm.Password
            };
        }

So we have written the implicit conversion between these tow types at one place and we will be reusing it everywhere we need.

yes i mean that, now these two types can be implitly convertable / cast in to eachother.

My action would look like this now:


[HttpPost]
        [AllowAnonymous]
        public ActionResult SignUp(RegisterViewModel registerVM)
        {
            if (ModelState.IsValid)
            {

                var result = authenticateService.RegisterUser(registerVM);  // implicit conversion from RegisterViewModel to User Model

                RegisterViewModel vm = result; // see implicit conversion from User model to RegisterViewModel

                return View(vm);

            }
            return View(registerVM);
        }

You can read more about implicit operator at MSDN if you are interested.

Sunday, July 12, 2015

Image ActionLink Html Helper in asp.net mvc

For creating a link in asp.net mvc we use Link Extension provided by  the mvc framework. For creating a simple anchor tag we use Html.ActionLink() helper which generates anchor tag for us.

For Example:


@Html.ActionLink("Link Display Text","Index","Home")

This will render following html:


<a href="/Home/Index">Link Display Text</a>

Now if we want to create a image link, we can use html to create image link this way:


<a href="/Home/Index">
<img src="/images/untitled.png">
</a>

This will work obviously,but what if we want to do it with Html Helper method as we do using Html.ActionLink, but we do not have any helper for image link provided by framework, so one can do it using html as i wrote above or will have to write custom html helper.

It's the beauty of asp.net mvc that we can extend exisiting helpers according to our needs and can also add new html helpers in case we need to used it at many places , in that case better approach is to create a helper extesnion and use it every where in the project.

Now for creating helper extension first of all we need to create a static class, as its the pre-requisite for creating extesnion methods that the method should be static, and it  should be inside a static class.

Here is the code for extension method for ImageActionLink helper extension:


namespace MyApplication.Helpers
{
  public static class CustomHtmlHelepers
  {
    public static IHtmlString ImageActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, object routeValues, object htmlAttributes,string imageSrc)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var img = new TagBuilder("img");
        img.Attributes.Add("src", VirtualPathUtility.ToAbsolute(imageSrc));
        var anchor = new TagBuilder("a") { InnerHtml = img.ToString(TagRenderMode.SelfClosing) };
        anchor.Attributes["href"] = urlHelper.Action(action, controller, routeValues);
        anchor.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        return MvcHtmlString.Create(anchor.ToString());

    }
  }
}


The first parameter with this keyword is used in extension methods see this article on Extension Method for understanding what are extesnion methods.

and now we can call it from View for creating Image Link. But remember that we will have to include the namespace in the View in which we have create the class and extension method,but if you have create it in the same namespace, then it will be accessible without adding any using statement in View.

In my case i have seperated all Extension Methods in seperate namespace named Helpers so i will have to include it in View via using statement:


@using MyApplication.Helpers;

@Html.ImageActionLink("Link Display Text","Index","Home",null,null,"~/images/untitled.png")

It will render the same html which i wrote above which is :

<a href="/Home/Index">
<img src="/images/untitled.png">
</a>

I hope it makes you understand how you can write you own custom html helpers in asp.net mvc.

Thursday, June 18, 2015

Disable textbox cut copy paste in asp.net and asp.net mvc using javascript,jquery

In some scenarios, we don't want user to be able to cut or copy the value of text box and we also want to restrict user to not be able to paste value from clipboard in text box.


User have couple of options, he can use short cut keys , for example Ctrl + C for copying and Ctrl + V , or user can right click inside the control and can use use context menu buttons which are mostly Cut, Copy and Paste available for doing desired operation on control.


One way is to write java-script events  for cut,copy and paste so that whenever user do one of these operations on control we handle them to override the default implementation of these commands.



In asp.net mvc we can use the htmlAttributes parameter of Html Helper method do it.

Disabling Using  JavaScript:


Here is an example code using javacript:



@Html.TextBoxFor(model => model.Question, 
          new {
                       @class="form-control",
                       oncut="return false"
                       oncopy="return false", 
                       onpaste="return false"
                     }
                 )

Here is the Live DEMO Fiddle of it.


Disabling Using JQuery:


We can do the same using jquery as well this way:

@Html.TextBoxFor(model => model.Question, 
          new {
                       @class="form-control",
                       id="txtQuestion"
                       oncut="return false"
                       oncopy="return false", 
                       onpaste="return false"
                     }
                 )

and in jquery :


$("#txtQuestion").on("cut copy paste",function(e) {

   e.preventDefault();
    // it will cause to stop default behaviour ofcommand
   // or we can use return false as well, as we did in js

}

 You can do it same way in asp.net web forms as well, for example:


<asp:TextBox ID="txtQuestion" 
             runat="server"
      CssClass="form-control"
             oncut="return false"
             oncopy="return false" 
             onpaste="return false">
</asp:TextBox>

Saturday, June 13, 2015

Difference between static and sealed class in c#

What is static class

A static class is very similar to non-static class, however there's one difference: a static class  can't be instantiated. In different words, you can not use the new keyword to make a variable of that class type. As a result of there's no instance variable, you access the static class members  by using class name. 

For Example,we have following static class which has a static method which adds two number.This is just as example, we already have a Math class in System namespace which framework has provided which has all the commonly used Math functions available:


public static class MathUtility
{
 public static int Add(int a, int b)
 {
  return a+b;
 }
}


We can call it this way:


int result = MathUtility.Add(2,5);


A static class will be used as a convenient instrumentation for sets of ways that simply treat input parameters and don't got to get or set any internal instance fields. for instance, in the .NET Framework class Library, the static System.Math class contains functions/methods that perform mathematical operations, with none demand to store or retrieve knowledge that's distinctive to a specific instance of the Math class. That is, you apply the members of the class by specifying the class name and also the methodology name, as shown within the following example.



double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

Output:

3.14

-4

3


As is that the case with all class types, the data for a static class is loaded by the .NET Framework common language runtime (CLR) once the program that references the class is loaded. The program cannot specifically tell when the class is loaded. However, it's certain to be loaded and to own its fields initialized and its static constructor referred to as before the class is documented for the primary time in your program. A static constructor is called just once, and a static class remains in memory for the time period of the applying domain during which your program resides.



Features of Static Class:

  1. It can only have static members.
  2. It cannot have instance members as static class instance cannot be created.
  3. It is a sealed class.
  4. As static class is sealed, so no class can inherit from a static class.
  5. we cannot create instance of static class that's the reason we cannot have instance members in static class, as static means shared so one copy of the class is shared to all.
  6. static class also cannot inherit from other classes.


What is sealed class


A sealed class cannot be inherited(means it cannot be used as a base class). It stops/restricts other classes from inheriting from it. Yes, when a class is marked sealed no other classes could inherit from it.

Consider the following example in which  class SealedClass inherited from class BaseClass but as we have marked SealedClass sealed using sealed modifier, it cannot be used as base class by other classes.

Consider the following example:

class BaseClass 
{

}    

sealed class SealedClass : BaseClass
{

}

We can also make methods and properties sealed. We can also mark overridden methods or properties  of base class in child class sealed so that they cannot be overridden further sub-classes that inherit from this subclass.


class A
{
 protected virtual void Foo()
 {
  Console.WriteLine("A.Foo");
 }

 protected virtual void Bar()
 {
  Console.WriteLine("A.Bar");
 }
}

class B : A
{
 sealed protected override void Foo()
 {
  Console.WriteLine("B.Foo");
 }

 protected override void Bar()
 {
  Console.WriteLine("B.Bar");
 }
}

Now see this :


class C : B
{
 // Attempting to override Foo causes compiler error CS0239. 
 // protected override void Foo() { Console.WriteLine("C.Foo"); }
 // Overriding F2 is allowed. 
 protected override void Bar()
 {
  Console.WriteLine("C.Bar");
 }
}

you cannot use abstract and sealed modifier together with a class because abstract class has to be inherited by some sub-class that gives implementation of  abstract methods/properties.

Also when using sealed modifier with methods/properties that method should be override.In .Net Framework structs are implicitly sealed which means they cannot be inherited.

Some run-time optimization are also done when sealed class members are called, so calling of  sealed class members is slightly faster than other.

The following are the points to keep in mind about sealed class:

  1. sealed class can be instantiated.
  2. It can inherit from other classes.
  3. It cannot be inherited

Wednesday, June 10, 2015

User Friendly Display Text For Enum in C#

When using Enum sometime we dont want to show the enum name that we have in code to user but instead of that we want to show some text that is understanable for end user.I will share today how we can set display text on Enum values that we can use to show to end-user.

Consider this Enum:


public enum eUserRole : int
 {
    SuperAdmin = 0,
    PhoenixAdmin = 1,
    OfficeAdmin = 2,
    ReportUser = 3,
    BillingUser = 4
  }



So, it is obvious that one would not like to show user SuperAdmin in this way without space, one would expect it to be displayed like "Super Admin" at front end.


For that first of all we will have to create a custom DisplayName attribute for Enum:

public class EnumDisplayNameAttribute : Attribute
{
  private string _displayName;
  public string DisplayName
  {
      get { return _displayName; }
      set { _displayName = value; }
  }
}

Now we can use this attribute to decorate it on our Enum values:

public enum eUserRole : int
{
    [EnumDisplayName(DisplayName="Super Admin")]
    SuperAdmin = 0,
    [EnumDisplayName(DisplayName = "Phoenix Admin")]
    PhoenixAdmin = 1,
    [EnumDisplayName(DisplayName = "Office Admin")]
    OfficeAdmin = 2,
    [EnumDisplayName(DisplayName = "Report User")]
    ReportUser = 3,
    [EnumDisplayName(DisplayName = "Billing User")]
    BillingUser = 4
}

For getting the DisplayName atttribute we have wrote an extension method on Enum which will return us the DisplayName attribute value:


public static class EnumExtensions
{

   public static string DisplayName(this Enum value)
   {
       FieldInfo field = value.GetType().GetField(value.ToString());

       EnumDisplayNameAttribute attribute
               = Attribute.GetCustomAttribute(field, typeof(EnumDisplayNameAttribute))
                   as EnumDisplayNameAttribute;

       return attribute == null ? value.ToString() : attribute.DisplayName;
   }
}
and now we can call it on Enum values to get the DisplayName attribute value simply:


      Console.WriteLine(eUserRole.SuperAdmin.DisplayName());


This will output on Console:

           Super Admin 

Sunday, June 7, 2015

OOP Difference between Shadowing and Overriding

I have read many stuff on internet regarding shadowing concept of Object Oriented Programming.Today i will try to explain the shadowing in OOP using C# with examples.

Using Shadowing we can  provide a new implementation to base class member without overriding it.


Consider a scenario where you have an external assembly which you have added in your project. You have a class in that assembly and it has a method which is not defined as virtual and you want to override that method(define your own implementation for that method) in the derived class. What would you do. This is the scenario where you can use shadowing concept to override the method in the derived class at run-time. I will explain it with example next.

Following are few definition of shadowing.

What is Shadowing:

Here are a few definitions of it:

Accroding to MSDN:

1) Shadowing is concept of using Polymorphism in Object Oriented Programming. When two programming elements share the same name, one of them can hide, or shadow, the other one. In such a situation, the shadowed element is not available for reference; instead, when your code uses the element name, the compiler resolves it to the shadowing element.

2) Shadowing is actually hiding overridden method implementation in derived class and call the parent call implementation using derived class object.


Example:

Suppose, I have a base class BaseLogger which has two virtual methods(means they can be overridden in subclass) defined:


public abstract class BaseLogger
{
    public virtual void Log(string message)
    {
        Console.WriteLine("Base: " + message);
    }

    public virtual void LogCompleted()
    {
        Console.WriteLine("Completed");
    }
}

Now i create a class Logger that inherits from BaseLogger class. Logger class looks like this:


public class Logger : BaseLogger
{
    public override void Log(string message)
    {
        Console.WriteLine(message);
    }

    public new void LogCompleted()
    {
        Console.WriteLine("Finished");
    }
}

Now i want my Console to Print following lines:

Log started!
Base: Log Continuing
Completed



What should i write in Main Program to get the above output ? Here is the code we will need to write:


public class Program
{
    public static void Main()
    {

        BaseLogger logger = new Logger();

        logger.Log("Log started!");
        logger.Log("Base: Log Continuing");
        logger.LogCompleted();
    }
}

The first call to Log method is ok, it has called Derived Logger class Log method and it should because we have overridden it in the Logger class.

The second call is also same.

Now note the third call, it has called  the base class LogCompleted() method not derived class, it is because we have defined derived class method with new keyword which is hiding the derived class method when we are calling it with object of type BaseLogger which is our base class.

If we want to call the derived class LogCompleted() method our object reference should be of type Logger not BaseLogger.While in method overriding this is not the case.

In method overriding if we cast object of dervied class to base  class and call method, it will call overridden implementation of dervied class. For example, the following line will output "Log started!" not "Base : Log started!":