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