在 ASP.NET Core MVC 中选择标记帮助器

2023-12-14

我需要有关 ASP.NET Core 中的选择标记帮助程序的一些帮助。

我有一个员工列表,我正在尝试将其绑定到选择标签助手。我的员工在List<Employee> EmployeesList并且选定的值将进入EmployeeId财产。我的视图模型如下所示:

public class MyViewModel
{
   public int EmployeeId { get; set; }
   public string Comments { get; set; }
   public List<Employee> EmployeesList {get; set; }
}

我的员工类别如下所示:

public class Employee
{
   public int Id { get; set; }
   public string FullName { get; set; }
}

我的问题是如何告诉我的选择标签助手使用Id作为显示时的值FullName在下拉列表中?

<select asp-for="EmployeeId" asp-items="???" />

我希望得到一些帮助。谢谢。


使用 Select Tag 助手呈现 SELECT 元素

在 GET 操作中,创建视图模型的对象,加载EmployeeList集合属性并将其发送到视图。

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.EmployeesList = new List<Employee>
    {
        new Employee { Id = 1, FullName = "Shyju" },
        new Employee { Id = 2, FullName = "Bryan" }
    };
    return View(vm);
}

并在您的创建视图中创建一个新的SelectList对象从EmployeeList属性并将其作为值传递给asp-items财产。

@model MyViewModel
<form asp-controller="Home" asp-action="Create">

    <select asp-for="EmployeeId" 
            asp-items="@(new SelectList(Model.EmployeesList, nameof(Employee.Id), nameof(Employee.FullName)))">
        <option>Please select one</option>
    </select>

    <input type="submit"/>

</form>

并且您的 HttpPost 操作方法接受提交的表单数据。

[HttpPost]
public IActionResult Create(MyViewModel model)
{
   //  check model.EmployeeId 
   //  to do : Save and redirect
}

Or

如果您的视图模型有List<SelectListItem>作为下拉项目的属性。

public class MyViewModel
{
    public int EmployeeId { get; set; }
    public string Comments { get; set; }
    public List<SelectListItem> Employees { set; get; }
}

在你的行动中,

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Sean", Value = "2"}
    };
    return View(vm);
}

并且在视图中,可以直接使用Employees财产为asp-items.

@model MyViewModel
<form asp-controller="Home" asp-action="Create">

    <label>Comments</label>
    <input type="text" asp-for="Comments"/>

    <label>Lucky Employee</label>
    <select asp-for="EmployeeId" asp-items="@Model.Employees" >
        <option>Please select one</option>
    </select>

    <input type="submit"/>

</form>

班上SelectListItem属于Microsoft.AspNet.Mvc.Rendering命名空间。

确保您对选择元素使用显式结束标记。如果您使用自闭合标签方法,标签助手将呈现一个空的 SELECT 元素!

下面的方法不管用

<select asp-for="EmployeeId" asp-items="@Model.Employees" />

但这会起作用。

<select asp-for="EmployeeId" asp-items="@Model.Employees"></select>

使用实体框架从数据库表中获取数据

上面的示例使用硬编码项作为选项。所以我想我会添加一些示例代码来使用实体框架获取数据,因为很多人都使用它。

假设您的 DbContext 对象有一个名为Employees,其类型为DbSet<Employee>哪里的Employee实体类有一个Id and Name像这样的财产

public class Employee
{
   public int Id { set; get; }
   public string Name { set; get; }
}

您可以使用 LINQ 查询来获取员工,并使用 LINQ 表达式中的 Select 方法来创建员工列表SelectListItem每个员工的对象。

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = context.Employees
                          .Select(a => new SelectListItem() {  
                              Value = a.Id.ToString(),
                              Text = a.Name
                          })
                          .ToList();
    return View(vm);
}

假设context是您的数据库上下文对象。查看代码与上面相同。

使用选择列表

有些人更喜欢使用SelectList类来保存呈现选项所需的项目。

public class MyViewModel
{
    public int EmployeeId { get; set; }
    public SelectList Employees { set; get; }
}

现在在您的 GET 操作中,您可以使用SelectList构造函数来填充Employees视图模型的属性。确保您指定的是dataValueField and dataTextField参数。您可以使用表达式名称静态链接字段名称。

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new SelectList(GetEmployees(), nameof(Employee.Id), nameof(Employee.FirstName));
    return View(vm);
}
public IEnumerable<Employee> GetEmployees()
{
    // hard coded list for demo. 
    // You may replace with real data from database to create Employee objects
    return new List<Employee>
    {
        new Employee { Id = 1, FirstName = "Shyju" },
        new Employee { Id = 2, FirstName = "Bryan" }
    };
}

在这里我打电话给GetEmployees方法获取 Employee 对象的列表,每个对象都有一个Id and FirstName属性,我将这些属性用作DataValueField and DataTextField of the SelectList我们创建的对象。您可以将硬编码列表更改为从数据库表读取数据的代码。

查看代码将是相同的。

<select asp-for="EmployeeId" asp-items="@Model.Employees" >
    <option>Please select one</option>
</select>

从字符串列表中呈现 SELECT 元素。

有时您可能想要从字符串列表中呈现选择元素。在这种情况下,您可以使用SelectList构造函数只需要IEnumerable<T>

var vm = new MyViewModel();
var items = new List<string> {"Monday", "Tuesday", "Wednesday"};
vm.Employees = new SelectList(items);
return View(vm);

查看代码将是相同的。

设置选定的选项

有时,您可能希望将一个选项设置为 SELECT 元素中的默认选项(例如,在编辑屏幕中,您希望加载以前保存的选项值)。为此,您只需设置EmployeeId属性值设置为您想要选择的选项的值。

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "11"},
        new SelectListItem {Text = "Tom", Value = "12"},
        new SelectListItem {Text = "Jerry", Value = "13"}
    };
    vm.EmployeeId = 12;  // Here you set the value
    return View(vm);
}

这将在页面呈现时选择 select 元素中的 Tom 选项。

多选下拉菜单

如果你想渲染一个多选下拉列表,你可以简单地改变你使用的视图模型属性asp-for您视图中的属性为数组类型。

public class MyViewModel
{
    public int[] EmployeeIds { get; set; }
    public List<SelectListItem> Employees { set; get; }
}

这将使用以下内容呈现 select 元素的 HTML 标记multiple属性允许用户选择多个选项。

@model MyViewModel
<select id="EmployeeIds" multiple="multiple" name="EmployeeIds">
    <option>Please select one</option>
    <option value="1">Shyju</option>
    <option value="2">Sean</option>
</select>

在多选中设置选定的选项

与单选类似,设置EmployeeIds属性值到您想要的值的数组。

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "11"},
        new SelectListItem {Text = "Tom", Value = "12"},
        new SelectListItem {Text = "Jerry", Value = "13"}
    };
    vm.EmployeeIds= new int[] { 12,13} ;  
    return View(vm);
}

当页面呈现时,这将在多选元素中选择“汤姆和杰瑞”选项。

使用ViewBag传输项目列表

如果您不喜欢保留集合类型属性来将选项列表传递给视图,您可以使用动态 ViewBag 来执行此操作。(这不是我个人推荐的方法,因为 viewbag 是动态的,并且您的代码很容易出现未捕获的拼写错误)

public IActionResult Create()
{       
    ViewBag.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Sean", Value = "2"}
    };
    return View(new MyViewModel());
}

并在视图中

<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
    <option>Please select one</option>
</select>

使用 ViewBag 传输项目列表并设置所选选项

与上面相同。您所要做的就是将属性(您为其绑定下拉列表)值设置为您想要选择的选项的值。

public IActionResult Create()
{       
    ViewBag.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Bryan", Value = "2"},
        new SelectListItem {Text = "Sean", Value = "3"}
    };

    vm.EmployeeId = 2;  // This will set Bryan as selected

    return View(new MyViewModel());
}

并在视图中

<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
    <option>Please select one</option>
</select>

对项目进行分组

选择标签帮助器方法支持下拉列表中的分组选项。您所要做的就是指定Group各财产价值SelectListItem在你的行动方法中。

public IActionResult Create()
{
    var vm = new MyViewModel();
   
    var group1 = new SelectListGroup { Name = "Dev Team" };
    var group2 = new SelectListGroup { Name = "QA Team" };

    var employeeList = new List<SelectListItem>()
    {
        new SelectListItem() { Value = "1", Text = "Shyju", Group = group1 },
        new SelectListItem() { Value = "2", Text = "Bryan", Group = group1 },
        new SelectListItem() { Value = "3", Text = "Kevin", Group = group2 },
        new SelectListItem() { Value = "4", Text = "Alex", Group = group2 }
    };
    vm.Employees = employeeList;
    return View(vm);
}

视图代码没有变化。选择标签助手现在将呈现 2 内的选项optgroup items.

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

在 ASP.NET Core MVC 中选择标记帮助器 的相关文章

  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些

随机推荐

  • 创建较大集合的固定长度非重复排列

    我知道这个话题被广泛讨论 但我似乎找不到任何适合我需求的实现 我有以下字符集 abcdefgh 我想获得所有可能的排列或组合 不重复 但在有限 可变 字符集上 意思是如果我输入字符和数字2 结果应该是这样的 ab ba ac ca ad d
  • 将原始输入变量除以数字时出现 Python TypeError

    我想将输入的磅重量转换为千克 但出现以下错误 类型错误 不支持的操作数类型 unicode 和 float My code lbweight raw input Current Weight lb kgweight lbweight 2 2
  • 挂载前判断网络共享是否存在

    我正在开发一种工具 可以根据用户连接的无线网络自动安装网络卷 安装卷很简单 NSURL volumeURL The URL to the network volume Attempt to mount the volume FSVolume
  • Springboot异常处理程序没有捕获异常

    在 Spring Boot 和 Rest 应用程序中 我配置了一个异常处理程序 如下所示 如果在请求使其停止服务后抛出异常 它可以正常工作 Rest api 需要 application json 的内容类型 如果我不将该内容类型标头发送到
  • 用 Java 处理条形码扫描

    我想让我的应用程序对扫描的条形码做出反应以触发按钮按下 例如 用户可以扫描 打印 条形码来激活打印按钮 条形码将被视为用户输入了一些文本 我不确定扫描仪是否会被设置为在末尾附加一个输入或一个选项卡或什么都没有 所以我不想在此基础上做出假设
  • 将等高线添加到 3D 绘图

    我正在使用 R 编程语言 我使用 plotly 库制作了以下 3 维图 library dplyr library plotly my function lt function x y final value 1 x 2 100 y x 2
  • 如何获取 foreach 循环当前迭代的索引?

    在 C 中是否有一些我没有遇到过的罕见语言构造 比如我最近学到的一些 一些在 Stack Overflow 上 来获取表示 foreach 循环当前迭代的值 例如 我目前根据情况做这样的事情 int i 0 foreach Object o
  • Threejs Blender 导出器导出格式错误

    我正在尝试在提供的帮助下将搅拌机模型导出到 Threejs json搅拌机出口商 解析 json 文件时出现错误 Uncaught TypeError Cannot read property length of undefined jso
  • 运行 plm 固定效应模型并添加因子虚拟变量(树方式固定效应)是否可以?

    运行 plm 固定效应模型并在 R 中添加因子虚拟变量 如下所示 是否可以 时间 公司 和 国家 这三个因素都是独立的指数 我想将它们一起修复 我发现下面的规范更适合我的情况 而不是通过组合 公司 和 国家 地区 来总共创建两个索引 这是可
  • Perl 数组与列表

    我在 Perl 中有两个数据结构 数组 my array2 1 2 3 for elem array2 print elem n 给我以下输出 1 2 3 还有一个清单 my array 1 2 3 for elem array print
  • 在 Java 中 - 如何将 resultSet 映射到复杂对象?

    如何将几个表中的结果集映射到复杂的对象中 让我详细说明一下 假设我有这两门课 public class User private int user id private String fname private String lname g
  • Facebooker 扩展权限?

    Facebook 允许访问 通过扩展权限访问用户的电子邮件 JS 和 PHP 中还有一种方法可以强制用户授予 当他们接受应用程序的 TOS 时获得许可 http wiki developers facebook com index php
  • 用 self 调用类变量

    你会如何想出这个有趣的 至少对我来说 例子 import numpy as np class Something object a np random randint low 0 high 10 def do self self a 1 p
  • 无法在OREO中获取默认帐户

    在安卓奥利奥中 AccountManager getAccountsByType com google 回报null 它在 Android 8 以下版本中运行良好 下面是我的代码 private static Account getAcco
  • 为什么将 OnClickListener 分配给 AutoCompleteTextView 会给出 NullPointerException?

    每当我将 android onClick 属性分配给 AutoCompleteTextView 时 我的应用程序在加载活动时立即崩溃 我已经在没有分配 onClick 方法的情况下测试了 AutoCompleteTextView 它似乎工作
  • Python 脚本到批处理文件

    我有一个运行 python 脚本的批处理文件 我正在运行Python 3 2 我想将一个变量 例如整数或字符串 从 python 脚本发送回批处理文件 这可能吗 我知道我可以在 Python 脚本中接受命令行参数sys argv 希望有一些
  • vbscript filesystemobject 如何编码字符?

    我有这个 vbscript 代码 Set fs CreateObject Scripting FileSystemObject Set ts fs OpenTextFile tmp txt 2 True for i 128 to 255 s
  • Google Drive:上传时自动转换文件?

    是否可以通过 Google Drive 访问自动地将上传的文档转换为原生格式 我知道它适用于manual上传 即 Google Drive 可以自动转换您通过网站上传的文件 但我想避免手动上传每个文件 我更喜欢使用 API 或者更好的是 将
  • 如何在 Java 正则表达式匹配中使用 IsAlphabetic 二进制属性?

    我使用此模式来检查字符串是否以冒号前面至少 2 个字母字符开头 string matches p IsAlphabetic 2 但我收到以下异常 java util regex PatternSyntaxException Unknown
  • 在 ASP.NET Core MVC 中选择标记帮助器

    我需要有关 ASP NET Core 中的选择标记帮助程序的一些帮助 我有一个员工列表 我正在尝试将其绑定到选择标签助手 我的员工在List