如何在 ASP.NET MVC 中的多个视图上正确填充控制器中 ViewData 的下拉列表

2024-01-08

我已经说过这一点大约一百万次了,但我对 ASP.Net MVC(以及一般的 ASP.NET)仍然是新手,所以很抱歉,如果这有点明显......

好的,我有一个控制器将数据发送到两个视图。一个视图仅列出数据库中的数据,而另一个视图允许您分别编辑和添加记录(它们使用相同的视图,但传入不同的参数)。

编辑视图是我的问题所在。我的表单中有四个下拉菜单,其中填充了我的存储库中的数据(来自我的数据库中的 3 个不同的表)。使用下面的代码,这一切都 100% 绝对正常,没有错误。

我的问题是填充这些下拉列表的最佳方法是什么?目前,我的视图代码如下所示,通过控制器中的 ViewData 传递数据:

编辑视图:

public ViewResult EditJob(int jobId)
{
    IList<JobCust> customerList = jobsRepository.JobCustomers.OrderBy(Customer => Customer.CompanyName).ToList();
    ViewData["customers"] = new SelectList(customerList, "CompanyName", "CompanyName");

    IList<JobVehicle> vehicleRegList = jobsRepository.JobVehicles.OrderBy(Vehicle => Vehicle.VehicleReg).ToList();
    ViewData["vehicleReg"] = new SelectList(vehicleRegList, "VehicleReg", "VehicleReg");

    IList<JobVehicle> vehicleTypeList = jobsRepository.JobVehicles.OrderBy(Vehicle => Vehicle.VehicleType).ToList();
    ViewData["vehicleType"] = new SelectList(vehicleTypeList, "VehicleType", "VehicleType");

    IList<JobDriver> driverList = jobsRepository.JobDrivers.OrderBy(Driver => Driver.LastName).ToList();
    ViewData["LastName"] = new SelectList(driverList, "LastName", "LastName");

    var job = jobsRepository.Jobs.First(x => x.JobID == jobId);
    return View(job);
}

添加视图:

public ViewResult AddJob()
{
    IList<JobCust> customerList = jobsRepository.JobCustomers.OrderBy(Customer => Customer.CompanyName).ToList();
    ViewData["customers"] = new SelectList(customerList, "CompanyName", "CompanyName");

    IList<JobVehicle> vehicleRegList = jobsRepository.JobVehicles.OrderBy(Vehicle => Vehicle.VehicleReg).ToList();
    ViewData["vehicleReg"] = new SelectList(vehicleRegList, "VehicleReg", "VehicleReg");

    IList<JobVehicle> vehicleTypeList = jobsRepository.JobVehicles.OrderBy(Vehicle => Vehicle.VehicleType).ToList();
    ViewData["vehicleType"] = new SelectList(vehicleTypeList, "VehicleType", "VehicleType");

    IList<JobDriver> driverList = jobsRepository.JobDrivers.OrderBy(Driver => Driver.LastName).ToList();
    ViewData["LastName"] = new SelectList(driverList, "LastName", "LastName");

    return View("EditJob", new Job());
}

我有一大块重复的代码困扰着我。我知道会有更好的解决方案,但我只是不知道它是什么。我现在想在此控制器内的另一个视图上使用同一组下拉菜单,因此我将使用当前方法第三次复制此代码。

有任何想法吗?也许这是我完全忽略的明显事情......提前感谢您的帮助。


您可以创建一个部分视图,它接受一个视图模型作为其模型,该视图模型旨在包含这四个下拉列表的数据。

然后有一些返回该视图的服务方法,然后可以从任何控制器调用该方法,然后直接传递到您的视图,或者作为子对象添加到另一个视图模型,然后将其传递到您的 PartialView。

// a view model class to contain the SelectLists that will be rendered as drop downs
public class DropDownViewModel
{
    public SelectList Customers{get;set;}
    public SelectList VehicleReg{get;set;}
    public SelectList VehicleType{get;set;}
    public SelectList LastName{get;set;}
}

// another view model that contains a child DropDownViewModel
// object and also the Job object. This is what the Add and Edit Views
// will be responsible for rendering
public class JobsViewModel
{
    public DropDownViewModel DropDownViewModel {get;set;}
    public Job Job {get;set;}
}


// a service level class that will be responsible for constructing the 
// DropDownViewModel object and populating with the required data
public class DropDownService
{
    public DropDownViewModel GetDropDownViewModel()
    {
        // data access code
    }
}

然后在你的控制器中

public ViewResult AddJob()
{
    // get the view model
    DropDownService service = new DropDownService();
    DropDownViewModel dropDownViewModel = service.GetDropDownViewModel();

    // create the wrapping JobViewModel that will contain the DropDownViewModel
    JobViewModel viewModel= new JobViewModel();
    viewModel.Job = new Job();
    viewModel.DropDownViewModel = dropDownViewModel;
    return View(viewModel);
}

public ViewResult EditJob(int jobId)
{
    // get the view model
    DropDownService service = new DropDownService();
    DropDownViewModel dropDownViewModel = service.GetDropDownViewModel();

    // create the wrapping JobViewModel that will contain the DropDownViewModel
    JobViewModel viewModel= new JobViewModel();
    viewModel.Job = jobsRepository.Jobs.First(x => x.JobID == jobId);
    viewModel.DropDownViewModel = dropDownViewModel;

    return View(viewModel);
}

在标记中,您需要要求添加/编辑视图将模型数据传递到 PartialView,您可以这样做:

<% Html.RenderPartial("MyPartialView", Model.DropDownViewModel); "%>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET MVC 中的多个视图上正确填充控制器中 ViewData 的下拉列表 的相关文章

随机推荐