gpt4 book ai didi

asp.net-mvc - 如何在 ASP.NET MVC 中的多个 View 上正确填充 Controller 中 ViewData 的下拉菜单

转载 作者:行者123 更新时间:2023-12-03 08:33:07 24 4
gpt4 key购买 nike

我已经说过大约一百万次了,但我对 ASP.Net MVC(以及一般的 ASP.NET)还是个新手,如果这有点明显,我深表歉意...

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

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

我的问题是填充这些下拉菜单的最佳方式是什么?目前,我的 View 代码是这样的,通过 Controller 中的 ViewData 传递数据:

编辑 View :

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

添加 View :

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());
}

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

有什么想法吗?也许这很明显我完全忽略了......在此先感谢您的帮助。

最佳答案

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

然后有一些返回该 View 的服务方法,然后可以从任何 Controller 调用它,然后直接传递给您的 View ,或者作为子对象添加到另一个 View 模型,然后将其传递给您的 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
}
}

然后在你的 Controller 中

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

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

<% Html.RenderPartial("MyPartialView", Model.DropDownViewModel); "%>

关于asp.net-mvc - 如何在 ASP.NET MVC 中的多个 View 上正确填充 Controller 中 ViewData 的下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com