C# 清理ViewBag';这是我的得失

C# 清理ViewBag';这是我的得失,c#,asp.net,asp.net-mvc,razor,viewbag,C#,Asp.net,Asp.net Mvc,Razor,Viewbag,我一直在使用viewbags来使用razor填充视图上的下拉列表,我想知道是否有任何方法来清理这段代码。我已经这样做了一段时间,我讨厌它的外观,它使所有的代码看起来非常混乱,必须在Get和Post操作中复制它。还有别的办法吗 下面是代码的样子: [HttpGet] public ActionResult EmployeeEdit(int id) { var employee = _employeeDb.EmployeeMasters.FirstOrDefault(e => e.ID

我一直在使用viewbags来使用razor填充视图上的下拉列表,我想知道是否有任何方法来清理这段代码。我已经这样做了一段时间,我讨厌它的外观,它使所有的代码看起来非常混乱,必须在Get和Post操作中复制它。还有别的办法吗

下面是代码的样子:

[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");
}

实现视图模型模式

您可以填充视图模型对象并将其发送到将绑定到该对象的视图。您可以在这个视图模型或您可能创建的转换器类的构造函数中执行许多丑陋的视图特定逻辑


我已编辑了您的标题。请参见“”,其中一致意见是“不,他们不应该”。在POST方法中,如果返回视图,则只需分配ViewBag属性(即ModelState无效)。你可以把这个代码放在一个单独的方法(比如<代码>配置文件视图模型)(<代码>)中,以避免重复代码并在必要时调用它,但是你确实应该考虑在视图模型中使用这些属性,而不是使用ViepBog。