Monday, 15 June 2015

Exception Handling - Best Practices

Exception Handling: A well known Concept. I hope everyone knows about it. A very simple but crucial piece of code.
In C#, it's all about try, catch and finally block.
try
{
       //Contains code which could throw unexpected error at run time which is called exception.
}
Catch(Exception)
{
      //Contains  exception handle logic, Ex.: logging.
}
finally
{
      //Contains code which will get executed if try block is executed. It will get executed if there is no exception or even if there is exception. Ex.: used to do memory release, connection close etc.
}


Looks very simple but still programmers do mistakes. So here I am going to discuss few best practices which I learned from my past experience.



1. Throwing exceptions hit performance badly. So try to minimize the 'throw' as much as possible.
Ex.:
void Method()
{
          for(int i = 0; i < 10000; i++)
          {
                try
                {  
                     if( i/2 == 0)
                            throw new Exception();
                 }
                 catch {}
         }
          Console.WriteLine("Loop Ends");
}

Above code practice is totally wrong. Just commenting out the " throw new Exception()" line of code can show the bad impact of having this line.

2. Can we put entire piece of code for a method in a single try block.
Yes. No harm in this.
Ex:
void Method()
{
       try
       {
              //Code
       }
       Catch(Exception)
       {
             
       }
}

3. Don't catch exception if you are not doing anything with the exception. Let the Calling method to catch exception and decide what to do.
Ex:
void Method()
{
       try
       {
              //Code
       }
       Catch(Exception)
       {
              throw;
       }
}

very bad practice of exception handling. It will hit the performance while throwing the exception, Never do it.

4. Don't use the catch exception object to throw exception if you need to catch the exception and then throw. It looses the stack trace details.
Ex:
void Method()
{
       try
       {
              //Code
       }
       Catch(Exception ex)
       {
             //Logging exception here or doing something.
              throw ex;
       }
}

the piece of code "throw ex" is bad practice instead you should write just "throw;"



5. Don't catch exception if you are not doing anything with the exception details.

6. All your public method must have 'try-catch' block instead of having it in private methods.
Note: Handle exception in private methods only if have no intention to throw exception to calling method.

7. Don't keep your catch block dumb.
Ex.
bool Method()
{
       bool status;
       try
       {
              //Code
       }
       Catch{}
       return status;
}

In above code you basically eat the exception. In this case if someone is calling this method he will always get returned FALSE and calling method will never know why return status is false.

8. Avoid returning "ex.Message"  Or "ex.InnerException.Message" as a return statement.
Ex:
string Method()
{
       try
       {
              //Code
       }
       catch (Exception ex)
      {
             return ex.Message; OR return ex.InnerException.Message;
      }
       return "";
}

Exception details always contains crucial and confidential information as it contains detail about the code, logic, resource details etc. So by writing above code you are basically creating a security risk by passing information to calling method.

9. Always use Custom Exception to throw exception when it is raised by service which is going to get consumed by different consumers directly.
Ex. If you are developing a service library or an API which can be consumed by different consumer. In this case you should not throw actual exception as it contains details about you business logic.

10. Don't forget to use try-catch or you will end up showing yellow page with exception details to the user.

Thank you for reading.
Feel free to provide your feedback/comments.


Wednesday, 10 June 2015

Dependency Injection with AngularJS Services

Hello Frnds,

Today we are going to discuss about dependency injection with AngularJS Services. It sounds interesting, Isn't it?

This post is the continuation of my previous post " CRUD with AngularJS and ASP.Net Web API".
So in case if you have not gone through that I would suggest please go through that.

What is Dependency Injection(DI):
In short & simple, It's a way to inject the dependencies. 
In detail, dependency injection is a software design pattern that implements inversion of control for software libraries. Caller delegates to an external framework the control flow of discovering and importing a service or software module specified or "injected" by the caller (source: http://en.wikipedia.org/wiki/Dependency_injection).

Dependency Injection is available through out the AngularJS. You can use it with Services, directives, filters, and animations etc. 
For more detail refer this: https://docs.angularjs.org/guide/di#



As I said DI can be used with services, So here I am going to explain you how you inject a service within a service. I am gonna use the same example here which I have used in my last post. In order to proceed I am going to do some changes in the example (used in previous post):
Change 1: Small change in our business model class "Book".
public class Book
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public decimal Price { get; set; }
        public decimal OfferPrice { get; set; } //This is new property which we are adding.
    }

Change2: Define a new AngularJS service class, by adding a new script file "BookngDiscountService.js" under Scripts=>BookngScripts folder.

app.service('bookDiscountManageService', function () {
    this.getDiscountOnBook = getDiscountOnBook = function (bookPrice) {
        if (bookPrice >= 500) {
            return bookPrice * 10 / 100;
        }
        else {
            return 0;
        }
    }
});

What this service does is, it defines a service method to decide discount based on some logic on MRP of book. Very simple isn't it?



Change 3: Modify the view to accommodate to show Price after discount (let's call it OfferPrice).
<table style="border: solid 2px Black; padding: 5px;">
                    <tr style="height: 30px; background-color:lightsteelblue; color: maroon;">
                        <th></th>
                        <th style="width:50px">ID</th>
                        <th style="width:150px">Name</th>
                        <th style="width:150px">Author</th>
                        <th style="width:100px">MRP Price</th>
                        <th style="width:100px">Offer Price</th>
                        <th style="width:50px"></th>
                        <th style="width:50px"></th>
                    </tr>
                    <tbody ng-repeat="book in Books">
                        <tr>
                            <td></td>
                            <td style="width:50px"><span>{{book.Id}}</span></td>
                            <td style="width:150px"><span>{{book.Name}}</span></td>
                            <td style="width:150px"><span>{{book.Author}}</span></td>
                            <td style="width:100px"><span>{{book.Price | currency}}</span></td>
                            <td style="width:100px"><span>{{book.OfferPrice | currency}}</span></td>
                            <td>
                                <input type="button" id="Edit" value="Edit" ng-click="get(book)" />
                            </td>

                            <td>
                                <input type="button" id="Delete" value="Delete" ng-click="delete(book)" />
                            </td>
                        </tr>
                    </tbody>
                </table> 

Change 4: I am going to inject my new service (bookDiscountManageService, defined in change step 3) to my existing service called "bookManageService" (defined in earlier post, BookngService.js).
So here is change we need to do in "bookManageService" to inject our new bookDiscountManageService into bookManageService service.
app.service('bookManageService', function ($http, bookDiscountManageService) {
....
....
}

Highlighted piece of code in above line is the change, and it means that our bookManageService is dependent on another service bookDiscountManageService which is being injected to this service.



Now I want to use the service method 'getDiscountOnBook' of bookDiscountManageService service to update OfferPrice of the book by calling it inside 'getAllBook' service method of 'bookManageService' service. This how we need to modify the code:
//Fetch All Books
    this.getAllBook = function () {
        return $http.get("/api/BookAPI").success(function (data) {
            $.each(data, function (i, item) {
                item.OfferPrice = item.Price - bookDiscountManageService.getDiscountOnBook(item.Price);
            });
        })
    }

Highlighted piece of code shows the change part. What it means is, After getting data from ASP.NET Web API, it calls the injected service 'bookDiscountManageService' to calculate the discounted price.

This is it. Now think about it How easy to achieve the dynamics of OfferPrice without doing any change in ASP.NET Web API or AngularJS controller or in the main AngularJS service. 

After this change here is UI which you will get:
Thank You for reading. Don't forget to like it and feel free to give your feedback/comment.



Monday, 8 June 2015

CRUD with AngularJS and ASP.Net Web API

It's really fun to learn something new and the more fun is in sharing it with people.
So here I am gonna explain you "How to perform CRUD with AngularJS using Asp.net Web API". AngularJS become such a hot client side technology in today's web world and believe me it's going to rule the web application development.
Before I start let's know a bit about basic of AngularJS.

What is AngularJS
AngularJS is a library written in JavaScript. It's an open-source web application framework developed and maintained by Google It helps to create single-page applications(SPA) that only requires HTML, CSS and Javascript on client side.
Do not compare it with JQuery, It uses a subset of JQuery to perform some task. So whenever you want/need to install AngularJS for your project then Install/include JQuery library first and then AngularJS.
To know more about AngularJS: https://docs.angularjs.org/guide/introduction

AngularJS extends HTML with ng-directive and the basic directives are:

  • ng-app: defines an AngularJS application.
  • ng-model: binds the value of HTML controls (input, select, textarea) to application data.
  • ng-bind: binds application data to the HTML view.
  • ng-controller: defines the application controller.

Apart from these basics directive I am going to use some concepts of AngularJS like Module, Service, Expressions etc. I would suggest if you have patience then better to spend some time here: http://www.w3schools.com/angular/

Hope by now you have learned about basics of AngularJS. So let's start with CRUD operation example.
where to start?????  Ok let's start with building Web API first which basically will perform CRUD with database. For the example purpose I have not used any database here but your Web Api will be the one which is going to interact with your database.
In short, ASP.NET Web API is a framework for building web APIs on top of the .NET Framework over http protocol. To know more about ASP.NET Web API refer this: http://www.asp.net/web-api.

To Create a ASP.NET Web API using Visual Studio 2013, create a new project => Web => ASP.NET Web Application and then select the template Web API.
(I assume, you are very much familier with visual studio tool and MVC framework and that's why I am not including any screenshot here for this.)


Once you create the project, Let's add a model class "Book.cs" under Model folder.

public class Book
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public decimal Price { get; set; }
    }

Then add a APIController with empty template for this, by right clicking of 'Controller' folder and name it "BookAPIController".

public class BookAPIController : ApiController
    {
        private static IList<Book> books = new List<Book>()
        {
            new Book{Id = "A01", Name = "Once upon a time", Author = "G D Roy", Price = 150.00M},
            new Book{Id = "A02", Name = "The Last Hero", Author = "K P Say", Price = 150.00M},
            new Book{Id = "A03", Name = "The King of Kingdom", Author = "Albert D", Price = 150.00M},
            new Book{Id = "A04", Name = "Jungle King", Author = "D Serduke", Price = 150.00M},
            new Book{Id = "A05", Name = "Magical Box", Author = "M Mathews", Price = 150.00M}
        };

        // GET: api/BookAPI
        public IEnumerable<Book> GetBooks()
        {
            return books;
        }

        // GET: api/BookAPI/5
        public Book GetBook(string id)
        {
            return books.FirstOrDefault<Book>(book => book.Id == id);
        }

        // POST: api/BookAPI
        public HttpResponseMessage PostBook(Book book)
        {
            books.Add(book);
            return Request.CreateResponse(HttpStatusCode.OK);
        }

        // PUT: api/BookAPI/5
        public HttpResponseMessage PutBook(Book book)
        {
            if(books.Any<Book>(bk => bk.Id == book.Id))
            {
                try
                {
                    Book currentBook = books.First<Book>(bk => bk.Id == book.Id);
                    int index = books.IndexOf(currentBook);
                    books[index] = book;
                    return Request.CreateResponse(HttpStatusCode.OK);
                }
                catch(Exception ex)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));  
                }
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }
        }

        // DELETE: api/BookAPI/5
        public HttpResponseMessage DeleteBook(string id)
        {
            if (books.Any<Book>(bk => bk.Id == id))
            {
                try
                {
                    Book currentBook = books.First<Book>(bk => bk.Id == id);
                    int index = books.IndexOf(currentBook);
                    if(books.Remove(currentBook))
                        return Request.CreateResponse(HttpStatusCode.OK);
                    else
                        return Request.CreateResponse(HttpStatusCode.InternalServerError);
                }
                catch (Exception ex)
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                }
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }
        }
    }

In above code, each and every method tells about himself.
Note: WEB API works on Get, Post, Put and Delete http methods.
So our Web API is ready and can be consumed by client.

Now we will actually talk about AngularJS framework to do the CRUD operation without any postback. Here we go:
 Let's add below mentioned three javascript file under 'Script' folder by creating a sub folder 'BookngScripts'. This sub folder is optional but it become necessary to separate out your files with other jquery and angular js files.

  1. BookngService.Js: This is AngularJS service which will basically consume the ASP.NET Web API and works as a middle layer between AngularJS controller and ASP.NET Web API.
  2. BookngModule.Js: It's a container for the different parts of an application. All application controller should belong to a module.
  3. BookngController.js: Controller is a JavaScript Object, created by a standard JavaScript object constructor.

Now we write code for above mentioned items:
BookngService.js
app.service('bookManageService', function ($http) { 

    //Add New Book
    this.post = function (Book) {
        var request = $http({
            method: "post",
            url: "/api/BookAPI",
            data: Book
        });
        return request;
    }

    //Fetch Book
    this.get = function (Id) {
        return $http.get("/api/BookAPI/" + Id);
    }

    //Fetch All Books
    this.getAllBook = function () {
        return $http.get("/api/BookAPI");
    }

    //Update Book  
    this.put = function (Book) {
        var request = $http({
            method: "put",
            url: "/api/BookAPI",
            data: Book
        });
        return request;
    }

    //Delete Book  
    this.delete = function (Id) {
        var request = $http({
            method: "delete",
            url: "/api/BookAPI/" + Id
        });
        return request;
    }

});

Here I created a AngularJS service called "bookManageService". It defines AngularJS service methods like post, get, getAllBook, put and delete. This service methods will be called from AngularJS controller.
Note: $http is an AngularJS service for reading data from remote servers.

Now we create controller called "bookController":
BookngController.js
app.controller('bookController', function ($scope, bookManageService) {
    $scope.IsInEditMode = false; //variable to decide, edit a record or create a record 
    $scope.Message = ""; //variable used to store error or success messages.
    
GetAllBooks(); 

    //Get All Books
    function GetAllBooks() {
        var reqGet = bookManageService.getAllBook();
        reqGet.then(function (obj) { $scope.Books = obj.data },
            function (error) {
                $scope.Message = 'Error while fetching records. Error:' + error;
            });
    }

    //Clear Book Model
    function Clear() {
        $scope.IsInEditMode = false;
        $scope.Id = "";
        $scope.Name = "";
        $scope.Author = "";
        $scope.Price = "";
    }

    //Create or Edit Book
    $scope.save = function () {
        var Book = {
            Id: $scope.Id,
            Name: $scope.Name,
            Author: $scope.Author,
            Price: $scope.Price
        };
        if($scope.IsInEditMode == false){//Adding new book
            var reqPost = bookManageService.post(Book);
            reqPost.then(function (obj) {
                $scope.Message = "Book added successfully";
                GetAllBooks();
                Clear();
            },
            function (err) {  
                $scope.Message = "Adding Book failed for following reason:" + err;  
            }); 
        }
        else { //Editing existing book detail
            Book.Id = $scope.Id;
            var reqPost = bookManageService.put(Book);
            reqPost.then(function (obj) {
                $scope.Message = "Book updated successfully";
                GetAllBooks();
                Clear();
            },
            function (err) {
                $scope.Message = "Updating Book failed for following reason:" + err;
            });
        }
    }

    //Delete a Book
    $scope.delete = function (Book) {
        var reqDelete = bookManageService.delete(Book.Id);
        reqDelete.then(function (obj) {
            GetAllBooks();
            $scope.Message = "Book deleted successfully";  
        },
        function (err) {
            $scope.Message = "Deleting Book failed for following reason:" + err ;
        });
    }

    //Fetch book detail
    $scope.get = function (Book) {
        var reqGet = bookManageService.get(Book.Id);
        reqGet.then(function (obj) {
            var res = obj.data;
            $scope.Id = res.Id;
            $scope.Name = res.Name;
            $scope.Author = res.Author;
            $scope.Price = res.Price;

            $scope.IsInEditMode = true;
        },
        function (err) {
            $scope.Message = "Unable to fetch book detail for following reason:" + err;
        });
    }

    //To Clear all Inputs controls value.  
    $scope.clear = function () {
        $scope.IsInEditMode = false;
        $scope.Id = "";
        $scope.Name = "";
        $scope.Author = "";
        $scope.Price = "";
    }

});

Here created a controller with the name "bookController" and it also define a function as second parameter which takes two argument $scope ($scope is the application object, the owner of application variables and functions. In short, It's the glue between application controller and the view) and the "bookManageService" (one which we created above here). Inside the function, I have defined four event method $scope.save, $scope.get, $scope.delete and $scope.clear.
Now we will create module:
BookngModule.js:
 var app = angular.module('bookModule', []);

and now create a MVC controller called "BookController" and add a action method called "Index".
BookController.cs
public class BookController : Controller
    {
        // GET: Book
        public ActionResult Index()
        {
            return View();
        }
    }


Now right click inside this Index and Add View with Empty(without a model) template and copy-paste the below code in your view:
<html ng-app="bookModule"> 
@{
    ViewBag.Title = "Manage Books";
}

<body>
    <table id="tblContainer" ng-controller="bookController">
        <tr>
            <td>
                <table style="border: solid 2px Black; padding: 5px;">
                    <tr style="height: 30px; background-color:lightsteelblue; color: maroon;">
                        <th></th>
                        <th style="width:50px">ID</th>
                        <th style="width:150px">Name</th>
                        <th style="width:150px">Author</th>
                        <th style="width:50px">MRP Price</th>
                        <th style="width:50px"></th>
                        <th style="width:50px"></th>
                    </tr>
                    <tbody ng-repeat="book in Books">
                        <tr>
                            <td></td>
                            <td style="width:50px"><span>{{book.Id}}</span></td>
                            <td style="width:150px"><span>{{book.Name}}</span></td>
                            <td style="width:150px"><span>{{book.Author}}</span></td>
                            <td style="width:50px"><span>{{book.Price | currency}}</span></td>
                            <td>
                                <input type="button" id="Edit" value="Edit" ng-click="get(book)" />
                            </td>

                            <td>
                                <input type="button" id="Delete" value="Delete" ng-click="delete(book)" />
                            </td>
                        </tr>
                    </tbody>
                </table>

            </td>
        </tr>
        <tr></tr>
        <tr></tr>
        <tr>
            <td>
                <div style="color: red;">{{Message}}</div>
                <table style="border: solid 4px Red; padding: 2px;">
                    <tr>
                        <td></td>
                        <td>
                            <span>Id</span>
                        </td>
                        <td>
                            <input type="text" id="BookId" ng-model="Id" />
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td>
                            <span>Name</span>
                        </td>
                        <td>
                            <input type="text" id="bookName" ng-model="Name" />
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td>
                            <span>Author</span>
                        </td>
                        <td>
                            <input type="text" id="bookAuthor" ng-model="Author" />
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td>
                            <span>Price</span>
                        </td>
                        <td>
                            <input type="text" id="bookPrice" ng-model="Price" />
                        </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td></td>
                        <td>
                            <input type="button" id="save" value="Save" ng-click="save()" />

                            <input type="button" id="Clear" value="Clear" ng-click="clear()" />
                        </td>
                    </tr>
                </table>

            </td>
        </tr>

    </table>
</body>
</html>  
<script src="~/Scripts/angular.min.js"></script>
<script src="~/Scripts/angular-route.min.js"></script>
<script src="~/Scripts/BookngScripts/BookngModule.js"></script>
<script src="~/Scripts/BookngScripts/BookngController.js"></script>
<script src="~/Scripts/BookngScripts/BookngService.js"></script>

If you see the highlighted piece of code, you will realized how your view is connected with the AngularJS controller which we created here and how your model data is getting bind with UI. Anyway let me give some note about the directives highlighted here:

  1. ng-app : this defines the module for our html page. 
  2. ng-controller: this allows me to define the controller for this module.
  3. {{xyz}}: this is the way to define an expression in AngularJS. You can also use such expression like {{5+2+3}}. Note: Instead of using expression to render value in html you can also use ng-bind directive. ex: <td style="width:50px"><span ng-bind="book.Id"></span></td>
  4. ng-click: this directive allows you to bind the event(the one which we created in controller using $scope.get = function(..){....}) for button click.
  5. ng-model: this bind the our model with view. So if view changes model will get updated automatically.
Here is the UI outcome of this:


That's it.

Thank You for reading. Feel free to give your feedback/comment.

Thursday, 14 May 2015

Custom Editor Template for a complex type in MVC

Hi,

Here I am going to demonstrate, How we can create a custom editor template for a complex type.

Let's take a scenario, We are building a application where a student can choose subject he/she wants to learn. Student and Subjects information are available in database. Here is corresponding model classes for Student and Subject. This is just an example.
 public class Student
    {
        public string Name { get; set; }
        public string Class { get; set; }
    }

public class Subject
    {
        public int Id { get; set; }
        public string Name { get; set; }

    }

And our UI should be something like this:
 and output should be like this.

There are multiple ways of doing this and easy way to achieve this is using custom editor template. Here I have two model classes "Student" and "Subject" and I can use this model classes as it is, to bind with view. So what to do. Here is the way, We need to create a ViewModel (ViewModel is required when we have more than one model classes for View, as we need in this example.).
Here I am gonna define ViewModel:

    public class StudentViewModel
    {
        public Student Student { get; set; }
        public List<SubjectsOpted> SubjectsOptedFor { get; set; }
    }

    public class SubjectsOpted
    {
        public Subject Subject { get; set; }
        public bool OptedIn { get; set; }
    }


What I did here?,
First, Created a class which has property of Subject class type and a bool type property. Actually purpose of doing this is, "I need custom editor template for this complex type which basically will help us to achieve the kind of UI we need.
Second, Created a class called StudentViewModel which will be used for binding for View.
Third, Will create custom editor for complex type SubjectOpted.

and here are the steps to create Custom Editor Template for complex type:
1. Add a folder called "EditorTemplates"
2. Create a cshtml file with the name of complex type, in this case it will be SubjectsOpted.cshtml.
3. Add code for this view:
    @model MVCEditorTemplatesExample.Models.SubjectsOpted
        @Html.CheckBoxFor(m => m.OptedIn, new { @checked = "checked" })
        @Html.HiddenFor(m => m.Subject.Id)
        @Html.HiddenFor(m => m.Subject.Name)
        @Html.DisplayFor(m => m.Subject.Name) <br />
4. Yeah, we are done with our custom Editor template for complex type.That's it. :)

Hold on, I still need to show you, how to use this template. Create a view and add below code,
@model MVCEditorTemplatesExample.Models.StudentViewModel
<!DOCTYPE html>
<html>
<head></head>
<body>
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        <div class="form-horizontal">
            <h4>Student</h4>
            <hr />
            @Html.ValidationSummary(true)
            <div class="form-group">
                @Html.LabelFor(model => model.Student.Name, new { @class = "control-label col-md-2" }):
                @Html.EditorFor(model => model.Student.Name)
                @Html.ValidationMessageFor(model => model.Student.Name)
            </div>
            <br />
            <div class="form-group">
                @Html.LabelFor(model => model.Student.Class, new { @class = "control-label col-md-2" }):
                @Html.EditorFor(model => model.Student.Class)
                @Html.ValidationMessageFor(model => model.Student.Class)
            </div>
            <br />
            <div>
                <b>Choose Subjects:</b><br />
                @Html.EditorFor(model => model.SubjectsOptedFor)
            </div>
            <br />
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }
    <br />
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
</body>
</html>

Take a look of highlighted code here, this is how we need to call editor template. too tough isn't it :). Based on complex type and name we used for template, MVC is smart enough to decide what editor should be called.



Let's also take a look of Post method, How view model data will get posted back. Mind it, it will be very tough task to do. Here is the code:
        [HttpPost]
        public ActionResult Create(StudentViewModel std)
        {
            try
            {
                std.SubjectsOptedFor.Remove(std.SubjectsOptedFor.FirstOrDefault(itm => itm.OptedIn == false));
                return View("View", std);
            }
            catch
            {
                return View();
            }
        }

:) Thanks to MVC model binder, who is smart enough to bind posted data with viewmodel which we created.

At last, in case if you want to see the code of view which I wrote to render the data (as shown in second UI at top), here it is.
@model MVCEditorTemplatesExample.Models.StudentViewModel
<html>
<head></head>
<body>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th></th>
        </tr>
        <tr>
            <td>
                <b>Name:</b> @Html.Label(Model.Student.Name) <br/>
                <b>Class:</b> @Html.Label(Model.Student.Class) <br/>
                <b>Subject Opted for:</b>
                <table>
                    @foreach (var subject in Model.SubjectsOptedFor)
                    {
                        <tr>
                            <td>
                                @if (subject.OptedIn) { 
                                    @Html.Label(subject.Subject.Name)} &nbsp;
                            </td>
                        </tr>
                    }
                </table>
            </td>
        </tr>
    </table>
</body>
</html>

That's it.

Thank You for reading. Don't forget to like it and feel free to give your feedback/comment.

Saturday, 9 May 2015

Delegate, Func and Anonymous Method in C#

Most confusing term, if you search these things on internet you will get lot of material related to this. Instead I thought to write this blog because I believe this can be explained in a very simple way. Let me give a try.

we will talk about all these three terms one by one.

1. Delegate: A delegate is a function pointer. In simple words, it keeps the reference of a function just like c and c++ (if you aware of these languages). Use of delegate in c# is callback.

Declaration syntax for delegate is same as a function in c# with an addition of  'delegate' keyword.
Ex:
 public delegate decimal CalculateInterestDelegate(decimal amount);

what this declaration means: This declaration means, CalculateInterestDelegate is a delegate which can hold an reference of function, whose return type is decimal and takes one parameter of decimal type.

Let's do it through an example:
    public class FuncDelegateExample
    {
        public delegate decimal CalculateInterestDelegate(decimal amount);
        public static decimal GetCalculatedAmount(decimal amount, CalculateInterestDelegate del)
        {
            return amount + del(amount);
        }
    }

Here I created a class and defined a delegate within that. I also defined a method which takes a delegate parameter which says that send me the delegate (function) and I'll invoke it. Now let's see how to use this delegate:
public class FuncDelegate
    {      
        static decimal CalculateInterest(decimal amount)
        {
            decimal intRate = 0.1M;
            return amount * intRate;
        }

        static void Main(string[] args)
        {
            decimal calculatedAmount = FuncDelegateExample.GetCalculatedAmount(5000, CalculateInterest));
        }
 }

Above class has a method called "CalculateInterest" which takes decimal parameter and returns a decimal. So this method can be assigned to the delegate which we can define like this:
CalculateInterestDelegate del = new CalculateInterestDelegate(CalculateInterest);

A delegate can hold more than one function pointer at a time and execute all of them together. This is how we can add another methods to the above delegate
 del += CalculateInterest2; 
del += CalculateInterest3; (say 'CalculateInterest2' & 'CalculateInterest3' are the another methods of same signature.)
Now when we say del(5000); all three methods assigned to this delegate will be called.
Any point of time if we want to remove any of the method reference from delegate, we can do it like this:
del -= CalculateInterest3;

Ok, Now let's come to the example which we have given here (FuncDelegate class). In this class we are passing the function "CalculateInterest" as parameter, it means we are assigning the "CalculateInterest" function to the "CalculateInterestDelegate" delegate and asking to "FuncDelegateExample"  to callback the method which is passed as delegate pointer. Hence in other words, we can also say that Delegate is used to communicate between two parties (classes).

I gave this example because with this example I also want to show you, How a method can be created which takes a delegate as a parameter and also down here I'll explain you the Func and Anonymous concept using same example.

Hope you understand the Delegate. Now let's talk about Func.

2. Func: In simple it's generic delegate. Syntax for Func is Func<T, TResult>. There are multiple overloaded types of Func.

Since Func is a generic delegate so we can change our "GetCalculatedAmount" method of "FuncDelegateExample" class like this:
public class FuncDelegateExample
{
     public static decimal GetCalculatedAmount(decimal amount, Func<decimal, decimal> funcDel)
        {
            return amount + funcDel(amount);
        }
}
In this case, there is no need to define the "CalculateInterestDelegate" delegate.



3. Anonymous Method: It is a method without a method name :). In other way, It's an "inline" statement or expression that can be used wherever a delegate type is expected. We can use it to initialize a named delegate or pass it instead of a named delegate type as a method parameter.

It means we can initialize our "CalculateInterestDelegate" delegate like this too:
CalculateInterestDelegate del = delegate(decimal amt){
                return amt * 0.1M;
            } ;

In this case we don't need "CalculateInterest" method in "FuncDelegate" class. And we can consume "FuncDelegateExample.GetCalculatedAmount" method like this:
CalculateInterestDelegate del = delegate(decimal amt){
                return amt * 0.1M;
            } ;
 decimal calcAmount = FuncDelegateExample.GetCalculatedAmount(5000, del);

At last, Just for info: We can consume "FuncDelegateExample.GetCalculatedAmount" method using lamda expression like this:
decimal calcAmount = FuncDelegateExample.GetCalculatedAmount(5000, (x => x* 0.1M));
In this case we don't need "CalculateInterest" method in "FuncDelegate" class.

I am Done. Hope this was helpful for you.

Thank You for reading. Don't forget to like it and feel free to give your feedback/comment.