如何在 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 的下拉列表 的相关文章

  • T4MVC Base 控制器没有默认构造函数

    我的控制器是从另一个没有默认构造函数的控制器继承的 T4MVC 生成以下构造函数 假设基本控制器具有默认构造函数 protected MyControllerController Dummy d 我该如何解决这个问题 有趣的是 根据this
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • ASP.NET MVC3 IIS7.5:Cache-Control maxage 始终为 0(不利于客户端缓存)

    我正在使用 Fiddler 测试我的网站 并注意到网络服务器总是返回 Cache Control private s maxage 0 用于动态内容 MVC 操作 这可以防止页面在客户端缓存 不知道是MVC还是IIS的问题 我该如何修复它
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 如何在单击按钮时重新绑定 igGrid igniteUI 控件中的数据?

    我在 ASP NET MVC3 应用程序中使用 Infragistics Ignite UI 控件 我有一个已绑定到 客户 数据的网格 工作正常 现在我有按钮了 单击后我会进行 ajax 调用 在控制器中 我编写了仅选择 客户 数据的一部分
  • jsFiddle 中的 jQuery 不显眼的自定义适配器和方法

    我无法使 jsFiddle 工作 但它可以在浏览器中工作 http jsfiddle net vtortola jYq2X http jsfiddle net vtortola jYq2X 我正在尝试添加新的自定义规则来比较两个字段 自定义
  • DropDownListFor 具有带有 - 属性名称的自定义属性?

    问题 我需要创建一个像这样的下拉列表
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 如何在 EditorTemplate 中获取完全限定的成员名称?

    我有一个 ASP NET MVC 4 站点 我将嵌套属性传递给 EditorTemplate 并使用构建字段名称ViewData ModelMetadata PropertyName但是 这获取子属性的属性名称 而不是我正在编辑的属性的完整
  • ASP.NET MVC区域命名空间问题

    我在我的 asp net mvc 3 解决方案中创建一个名为的新区域admin Visual Studio 自动分配名称空间 MyApp areas admin controllers 我将其更改为MyApp admin controlle
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • 使用 SimpleMembership 获取用户信息

    仍在尝试使用 MVC4 来掌握新的 SimpleMembership 我更改了模型以包含名字和姓氏 效果很好 我想更改登录时显示的信息 而不是在视图中使用 User Identity Name 我想做类似 User Identity For
  • WebActivator PreApplicationStartMethod 不起作用

    我正在按照 onin 架构制作一个新项目 我有一个名为 bootstrapper 的单独项目 其中包含 IOC 和 WebActivator 我的问题是包含 WebActivator 的类甚至没有在调试中加载 也许我错过了什么 assemb
  • asp.net mvc 我什么时候应该读取 servervariables?

    我什么时候可以从服务器变量收集信息 代码的一部分 我的意思是 我尝试过这样称呼 string temp Request ServerVariables Get HTTP REMOTE USER 在控制器构造函数中 但我收到一个空指针异常 而
  • 当 URL 包含 ASP.Net Core 参数的“+”时出现 404 错误

    当参数包含编码为空格的空格时 我的服务器返回 404 错误 代替 20 我不明白为什么 路线的形式为 Route Search PRM1 prm1 PRM2 prm2 PRM3 prm3 我的第一个问题是如何让服务器理解这种 URL htt
  • Microsoft MVC:手动触发表单验证

    有谁知道是否有办法手动触发 Net MVC 应用程序中的客户端表单验证 我想做以下事情 我已经查看了 MicrosoftMvcValidation js 中的代码 但没有找到可以在表单上调用的方法 我认为您正在寻找的验证可以在这里找到 ht
  • 如何在 ASP.NET MVC 5 中实现简单的身份验证

    我有一个带有 SQL Server 数据库的现有项目 带有数据库优先的 EF 工作单元和服务层 我需要添加 ASP NET MVC 项目并使用现有服务来验证用户身份 我发现了不同的复杂决定 我需要在身份中使用我的服务或在没有身份的情况下实现
  • MVC 5 Razor 活动导航选项卡

    我一直在尝试突出显示我的项目中的活动导航选项卡 我的任务是更新旧网站而不更改为引导程序 这是我的经验所在 我找到了一个包含我需要的大部分内容的示例 目前 唯一具有 选定类别 的选项卡是 主页 选项卡 当我单击另一个选项卡时 主页 选项卡不再
  • 在 MVC 3 中,我无法让 @Html.DisplayFor 呈现格式化字符串

    我希望这是一个非常简单的问题 尽管经过大量谷歌搜索后 我还没有能够解决这个问题 我正在使用 MVC 3 开发一个购物车网站 并使用代码优先的实体框架 我发送的模型是 Product 对象的列表 每个对象都包含此属性 Required Err
  • 在 MVC Razor 视图中使用旧版 ASP.NET ASCX 用户控件

    我正在尝试实现一个使用 WebForm ascx 用户控件 非 MVC 的 MVC Razor Layout cshtml 页面 我这样做是基于 Scott Hansleman 文章 将 Razor 视图和 WebForms 母版页与 AS

随机推荐