Sunday, January 31, 2016

Lync Cracker - MVC 5 Demo


Lync Cracker - MVC 5 Demo

Database tables:

CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](100) NULL,
[LastName] [varchar](100) NULL,
[StudentNumber] [varchar](100) NULL,
[IsActive] [bit] NOT NULL,
[CreatedBy] [varchar](100) NULL,
[DateCreated] [datetime2](7) NULL,
[UpdatedBy] [varchar](100) NULL,
[LastUpdated] [datetime2](7) NULL,
[Timestamp] [timestamp] NOT NULL
)

CREATE TABLE [dbo].[Subject](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StudentID] [int] NULL,
[SubjectName] [varchar](500) NULL,
[Credits] [float] NULL,
[IsActive] [bit] NOT NULL,
[CreatedBy] [varchar](100) NULL,
[DateCreated] [datetime2](7) NULL,
[UpdatedBy] [varchar](100) NULL,
[LastUpdated] [datetime2](7) NULL,
[Timestamp] [timestamp] NOT NULL
)


Create that EDMX for the database & Create partial Classes for Data Annotation. 

    [MetadataType(typeof(StudentMetaData))]
    public partial class Student
    {

    }

    public class StudentMetaData
    {
        [Display(Name = "Student_FirstName_Label", ResourceType = (typeof(Resources.Resources)))]
        [Required(ErrorMessageResourceName = "Student_FirstName_Required", ErrorMessageResourceType = (typeof(Resources.Resources)))]
        public string FirstName { get; set; }
    }

 Implement Provider Classes:

1. ProviderBase.cs
    public class ProviderBase
    {
        private LyncCrackerTestEntities _db = null;

        public LyncCrackerTestEntities DB
        {
            get
            {
                if (_db == null)
                {
                    _db=new LyncCrackerTestEntities();
                }

                return _db;
            }
        }
    }

2. StudentProvider.cs
    public class StudentProvider : ProviderBase, IStudentProvider
    {
        public Student GetStudent(int id)
        {
            return DB.Students.FirstOrDefault(u => u.ID == id);
        }

        public Student GetStudent(int id, LyncCrackerTestEntities db)
        {
            return db.Students.FirstOrDefault(u => u.ID == id);
        }

        public IQueryable GetStudents()
        {
            return DB.Students.Where(u => u.IsActive);
        }
    }


3. SubjectProvider.cs
    public class SubjectProvider : ProviderBase, ISubjectProvider
    {
        public Subject GetSubject(int id)
        {
            return DB.Subjects.FirstOrDefault(u => u.ID == id);
        }

        public Subject GetSubject(int id, LyncCrackerTestEntities db)
        {
            return db.Subjects.FirstOrDefault(u => u.ID == id);
        }

        public IQueryable GetSubjects(int studentId)
        {
            return DB.Subjects.Where(u => u.StudentID == studentId && u.IsActive);
        }

        public IQueryable GetSubjects(int studentId, LyncCrackerTestEntities db)
        {
            return db.Subjects.Where(u => u.StudentID == studentId && u.IsActive);
        }
    }


 Implement Service Classes:

1. StudentService.cs
    public class StudentService : IStudentService
    {
        private IStudentProvider _studentProvider = null;
        private ISubjectProvider _subjectProvider = null;

        public StudentService(IStudentProvider studentProvider, ISubjectProvider subjectProvider)
        {
            this._studentProvider = studentProvider;
            this._subjectProvider = subjectProvider;
        }

        public Student GetStudent(int id)
        {
            return _studentProvider.GetStudent(id);
        }

        public IQueryable GetStudents()
        {
            return _studentProvider.GetStudents();
        }

        public Student AddUpdateStudent(Student student, string userName)
        {
            try
            {
                Student newStudent = null;
                if (student != null)
                {
                    DateTime currentDateTime = DateTime.UtcNow;
                    using (var db = new LyncCrackerTestEntities())
                    {
                        if (student.ID == 0)
                        {
                            newStudent = new Student();
                            newStudent.FirstName = student.FirstName;
                            newStudent.LastName = student.LastName;
                            newStudent.StudentNumber = student.StudentNumber;
                            newStudent.IsActive = true;

                            newStudent.CreatedBy = userName;
                            newStudent.DateCreated = currentDateTime;
                            newStudent.UpdatedBy = userName;
                            newStudent.LastUpdated = currentDateTime;

                            // Subjects
                            foreach (var subject in student.Subjects)
                            {
                                subject.StudentID = newStudent.ID;
                                subject.SubjectName = subject.SubjectName;
                                subject.Credits = subject.Credits;
                                subject.CreatedBy = userName;
                                subject.DateCreated = currentDateTime;
                                subject.UpdatedBy = userName;
                                subject.LastUpdated = currentDateTime;
                                subject.IsActive = true;
                                newStudent.Subjects.Add(subject);
                            }

                            db.Students.Add(newStudent);
                        }
                        else
                        {
                            var oldStudent = _studentProvider.GetStudent(student.ID, db);
                            oldStudent.FirstName = student.FirstName;
                            oldStudent.LastName = student.LastName;
                            oldStudent.StudentNumber = student.StudentNumber;
                            oldStudent.IsActive = student.IsActive;

                            //oldStudent.Subjects.Clear();
                            var oldSubjects = _subjectProvider.GetSubjects(student.ID, db);
                            if (oldStudent.Subjects != null)
                            {
                                // Subjects
                                foreach (var subject in student.Subjects)
                                {
                                    var oldSubject = _subjectProvider.GetSubject(subject.ID, db);
                                    if (oldSubject == null)
                                    {
                                        var newSubject = new Subject();
                                        newSubject.StudentID = oldStudent.ID;
                                        newSubject.SubjectName = subject.SubjectName;
                                        newSubject.Credits = subject.Credits;
                                        newSubject.CreatedBy = userName;
                                        newSubject.DateCreated = currentDateTime;
                                        newSubject.UpdatedBy = userName;
                                        newSubject.LastUpdated = currentDateTime;
                                        newSubject.IsActive = true;
                                        oldStudent.Subjects.Add(newSubject);
                                    }
                                    else
                                    {
                                        oldSubject.SubjectName = subject.SubjectName;
                                        oldSubject.Credits = subject.Credits;
                                        oldSubject.LastUpdated = currentDateTime;
                                        oldSubject.UpdatedBy = userName;
                                    }
                                }

                                // Remove
                                foreach (var subject in oldSubjects)
                                {
                                    if (student.Subjects.FirstOrDefault(r => r.ID == subject.ID) == null)
                                    {
                                        var oldSubject = _subjectProvider.GetSubject(subject.ID, db);
                                        if (oldSubject != null)
                                        {
                                            oldSubject.IsActive = false;
                                            oldSubject.UpdatedBy = userName;
                                            oldSubject.LastUpdated = currentDateTime;
                                        }
                                    }
                                }
                            }
                        }

                        db.SaveChanges();
                    }
                }

                return newStudent;
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

2. SubjectService.cs
    public class SubjectService : ISubjectService
    {
        private ISubjectProvider _subjectProvider = null;

        public SubjectService(ISubjectProvider subjectProvider)
        {
            this._subjectProvider = subjectProvider;
        }


        public Subject GetSubject(int id)
        {
            return this._subjectProvider.GetSubject(id);
        }

        public IQueryable GetSubjects(int studentId)
        {
            return this._subjectProvider.GetSubjects(studentId);
        }

    }

Add Unity.MVC5
    public static class UnityConfig
    {
        public static void RegisterComponents()
        {
var container = new UnityContainer();
         
            // register all your components with the container here
            // it is NOT necessary to register your controllers
         
            // e.g. container.RegisterType();

            container.RegisterType();
            container.RegisterType();

            container.RegisterType();
            container.RegisterType();

            container.RegisterType("Home");
         
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }

Global.asax
UnityConfig.RegisterComponents();


Implement HomeController.cs

    public class HomeController : Controller
    {
        readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        private IStudentService _studentService = null;
        private ISubjectService _subjectService = null;

        public HomeController(IStudentService studentService, ISubjectService subjectService)
        {
            this._studentService = studentService;
            this._subjectService = subjectService;
        }

        public ActionResult Index()
        {
            logger.Error("My Error 1");
            var students = this._studentService.GetStudents().ToList();
         
            return View(students);
        }

        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create([Bind(Exclude = "Subject")]Student student)
        {
            student.Subjects = new List();
            TryUpdateModel(student.Subjects, "Subject");
            this._studentService.AddUpdateStudent(student, base.User.Identity.Name);
            return View();
        }

        public ActionResult Edit(int id)
        {
            var student = this._studentService.GetStudent(id);

            return View(student);
        }

        [HttpPost]
        public ActionResult Edit([Bind(Exclude = "Subject")]Student student)
        {
            student.Subjects = new List();
            TryUpdateModel(student.Subjects, "Subject");
            this._studentService.AddUpdateStudent(student, base.User.Identity.Name);
            return View();
        }

        public ActionResult StudentEntryRow()
        {
            var subject = new Subject();

            return PartialView("_Subject", subject);
        }

    }


Implement Views

Create.cshtml

id="subjectEditor" style="list-style-type: none"

    if (Model != null && Model.Subjects != null)
    {
        foreach (var subject in Model.Subjects.Where(u => u.IsActive).ToList())
        {
            Html.RenderPartial("_Subject", subject);
        }
    }

 id="addAnother" href="#">Add Another

    $(document).ready(function () {
        $.ajaxSetup({ cache: false });

        $("#addAnother").click(function () {
            //$.get('/Home/StudentEntryRow', function (template) {
            //    $("#subjectEditor").append(template);
            //});

            $.ajax({
                url: "/Home/StudentEntryRow",
                type: "POST",
                data: { id : $(this).val()},
                dataType: "html",
                async: true,
                success: function (data) {
                    $("#subjectEditor").append(data);
                },
                error: function (textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        });
    });

Partial View _Subject.cshtml
using (Html.BeginCollectionItem("Subject"))
 HiddenFor(model => model.ID)
        @Html.HiddenFor(model => model.StudentID)
    
        Subject Name :@Html.EditorFor(model => model.SubjectName)
        Credit: @Html.EditorFor(model => model.Credits)
        
        href="#" onclick="$(this).parent().remove();"Delete









Log4net
http://www.codeproject.com/Articles/823247/How-to-use-Apache-log-net-library-with-ASP-NET-MVC