Search code examples
c#asp.netasp.net-mvcrazorviewbag

Cleaning up ViewBag's in GET and POST


I have been using viewbags to populate the dropdown lists on my view using razor and I was wondering if there is anyway to cleanup this code. I have been doing this for a while and I hate the way it looks and it makes all the code look extremely cluttered and have to duplicate it in the Get and Post actions. Is there any other way to go about doing this?

Here is what the code looks like:

[HttpGet]
public ActionResult EmployeeEdit(int id)
{
    var employee = _employeeDb.EmployeeMasters.FirstOrDefault(e => e.ID == id);

    var nextReview = _employeeDb.EmployeeReviews.OrderByDescending(e => e.ReviewDate).FirstOrDefault(e => e.EmployeeNo == employee.EmployeeNumber);
    ViewBag.NextReviewDate = nextReview != null ? nextReview.ReviewDate.Value.ToShortDateString() : "Add Review Date";
    ViewBag.CompanyList = _selectListLib.GetCompanies((int)employee.CompanyNumber);
    ViewBag.BranchList = _selectListLib.GetBranches((int)employee.CompanyNumber, employee.Branch);
    ViewBag.departmentList = employee.DepartmentNumber != null ? _selectListLib.GetDepartments((int)employee.CompanyNumber, (int)employee.DepartmentNumber) : _selectListLib.GetDepartments((int)employee.CompanyNumber);
    ViewBag.EmployeeTypesList = _selectListLib.GetEmployeeTypes(employee.EmployeeType);
    ViewBag.PayTypesList = _selectListLib.GetPayTypes(employee.PayType);
    ViewBag.StatusList = employee.StatusFlag != null ? _selectListLib.GetStatusTypes((bool)employee.StatusFlag) : _selectListLib.GetStatusTypes();
    ViewBag.LastEditLabel = MakeLastEditString((int)employee.EmployeeNumber);
    ViewBag.Managers = employee.ManagerEmpNo != null ? _selectListLib.GetManagers((int) employee.CompanyNumber, (int) employee.ManagerEmpNo) : _selectListLib.GetManagers((int)employee.CompanyNumber);
    return View(employee);
}

[HttpPost]
public ActionResult EmployeeEdit(Models.EmployeeMaster employee)
{
    var nextReview = _employeeDb.EmployeeReviews.OrderByDescending(e => e.ReviewDate).FirstOrDefault(e => e.EmployeeNo == employee.EmployeeNumber);
    ViewBag.NextReviewDate = nextReview != null ? nextReview.ReviewDate.Value.ToShortDateString() : "Add Review Date";
    ViewBag.CompanyList = _selectListLib.GetCompanies((int)employee.CompanyNumber);
    ViewBag.BranchList = _selectListLib.GetBranches((int)employee.CompanyNumber, employee.Branch);
    ViewBag.departmentList = employee.DepartmentNumber != null ? _selectListLib.GetDepartments((int)employee.CompanyNumber, (int)employee.DepartmentNumber) : _selectListLib.GetDepartments((int)employee.CompanyNumber);
    ViewBag.EmployeeTypesList = _selectListLib.GetEmployeeTypes(employee.EmployeeType);
    ViewBag.PayTypesList = _selectListLib.GetPayTypes(employee.PayType);
    ViewBag.StatusList = employee.StatusFlag != null ? _selectListLib.GetStatusTypes((bool)employee.StatusFlag) : _selectListLib.GetStatusTypes();
    ViewBag.Managers = employee.ManagerEmpNo != null ? _selectListLib.GetManagers((int)employee.CompanyNumber, (int)employee.ManagerEmpNo) : _selectListLib.GetManagers((int)employee.CompanyNumber);

    if (!ModelState.IsValid) return View(employee);
    var result = _dbDataManipulation.UpdateEmployee((int)employee.CompanyNumber, employee.Initials, employee.FirstName, employee.LastName, (int)employee.DepartmentNumber, employee.EmployeeNumber.ToString(),
        employee.EmployeeType, (bool)employee.EnterTimeFl, Convert.ToDateTime(employee.StartDate), employee.PayType, (decimal)employee.Rate, (int)employee.UnionNo, employee.Branch, employee.G2ID, employee.JobTitle, CurrentUserName(),(bool)employee.StatusFlag, employee.MiddleName,(int)employee.ManagerEmpNo)
        ;
    ViewBag.Message = result;
    if (result != null)
        return View(employee);
    return RedirectToAction("Default");
}

Solution

  • Implement the View Model Pattern.

    You can populate view model object and send it to the view which will bind to that object. You can do lot of ugly view specific logic in constructor of this view model or converter class that you may create.

    http://nerddinnerbook.s3.amazonaws.com/Part6.htm