@Html.DropDownList基本用法

2024-07-03

我刚刚开始学习 MVC4,我必须承认,对 lambda 表达式、泛型和匿名类型的依赖给我带来了一些挑战,特别是当有许多重载函数时。尝试理解 HTML 帮助程序的工作原理有点令人困惑。以“DropDownListFor”帮助程序为例。我试图从我的代码中提取要点。这就是为什么您在表中只看到一列“性别”。希望它在语法上仍然正确:

@model IEnumerable<BusinessLayer.Employee>
<table>
    @foreach (var employee in Model) 
    {    
        <tr>
            <td>
            @{

                var listItems = new List<SelectListItem>()
                {
                    new SelectListItem {Text = "Male",   Value = "M"},
                    new SelectListItem {Text = "Female", Value = "F"}
                };

                @Html.DropDownListFor(m => employee.Gender, listItems, listItems.Find(i => i.Value == employee.Gender).Text)                          
            }  

            </td>
        </tr>
    }
</table>        

Model对象中有两个Employees,一个Employee的IEnumerable并生成以下HTML

<table> 
    <tr>
        <td>
            <select id="employee_Gender" name="employee.Gender"><option value="">Male</option>
                <option value="M">Male</option>
                <option value="F">Female</option>
            </select>
    </tr>       
        </td>    
             <select id="employee_Gender" name="employee.Gender"><option value="">Female</option>
                <option value="M">Male</option>
                <option value="F">Female</option>
             </select>                
        </td>
</table>                

查看 DropDownListFor 方法的第一个参数,

@Html.DropDownListFor(m => employee.Gender, ...

...我是否正确理解“m”代表传递到视图中的模型类的实例?在我看到的在线示例中,我看到过一些示例,其中“m”似乎是指模型类,但模型是单个实例类,例如,单个 Employee 对象,而不是 Employee 的集合,如在这种情况下,我想显示员工的表列表。我假设 DropDownListFor 方法的第一个参数的意图是“指向/绑定”到property在模型中,这就是我设置 m => employee.Gender 的原因。当模型是员工集合而不是单个员工时,这是我应该做的吗?如果是这样,我很困惑如何为两个下拉列表生成唯一的 ID,这两个下拉列表的 NAME 和 ID 属性都分配了“employee_Gender”。

对于Helper DropDownListFor的第三个参数,

listItems.Find(i => i.Value == employee.Gender).Text

这合理吗? employee.Gender 的值为“M”或“F”,但显示文本为“Male”和“Female”。我很困惑这个参数是否用于指定默认的“NO SELECT”第一个值,或者这个参数是否用于从下拉列表中选择当前员工的值——或者也许它可以两者兼得?例如,它是否选择Text如果找到则指定,否则添加指定的文本FIRST?如果没有找到参数值?从我的观察来看,这似乎就是它的工作原理。这个第三个参数可以简化吗?或者我的例子合理吗?

感谢您耐心阅读我的一系列问题,试图更好地理解这一点。


第 1 部分:解释 Lambda 魔法

你不是一个人。 Lambdas + MVC 使编码变得非常简单,但它们也使它看起来相当神奇(由于抽象)。

查看 DropDownListFor 方法的第一个参数 [...] 我是否正确理解“m”代表传递到视图中的模型类的实例?

Yes.

Razor 中的 HTML 助手 + Lambda 既简单又神奇,因为它们走的是捷径,实际上并没有向您透露发生了什么。

首先我们来看看@Html。我们知道@开始我们的 Razor 语法,然后Html是魔法。实际上,Html is an html助手 http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper%28v=vs.108%29.aspx自动初始化并提供给您的对象。更具体地说,它是一个HtmlHelper<TModel>。 Razor HTML 编辑器很智能,可以根据您所说的此视图的模型类型提前知道 TModel 的类型。这就是为什么你有如此多的智能感知。

当您输入时

@model IEnumerable<BusinessLayer.Employee>

编辑器阅读了该内容并假设 HTML Helper 将是HtmlHelper<IEnumerable<BusinessLayer.Employee>>。当编译页面时,HTML 帮助器实际上就是这种类型(当然)。

那么呢DropDownListFor或者任何其他扩展方法?

看着下拉列表的 http://msdn.microsoft.com/en-us/library/ee703573%28v=vs.108%29.aspx我们可以看到它实际上是DropDownListFor<TModel, TProperty>。我们现在知道 Model 是您的视图模型类型。DropDownListFor知道这一点,因为该方法是延伸 HtmlHelper<TModel>。因此 DropDownListFor 知道传入类型是在视图顶部定义的任何类型。关于什么TProperty?

TProperty是返回类型。这是您在选择属性时指定的类型。该视图为 HtmlHelper 提供模型类型,然后 HtmlHelper 为 DropDownListFor 提供模型类型,现在您处于 lambda 表达式中:(x => x.Property)您选择属性,然后属性会为您选择类型;在这种情况下string(性别)。

第 2 部分:您的问题

如果不确切知道您想要实现什么目标,则很难回答您的问题。您是否有一组员工,并且想要为每个员工显示多个性别下拉框,然后保存它们?

处理集合时会有点棘手,因为 MVC 不能很好地开箱即用地处理它们;通常最好根据您需要完成的任务编写自己的解决方案。

我真的不喜欢单个视图在页面上获取事物集合的想法。考虑一下这段逻辑:

你的方式:

  • 获取员工集合
  • 让员工有视野
  • 让视图创建单个 SelectListItem
  • 循环并显示每个 Employee 的 SelectList

My way

  • 获取员工集合
  • 给员工一个视野
  • 让视图循环并将每个员工传递到另一个视图(部分)
  • 每个部分处理一个员工

使用 MVC 时,请尝试将事物分解为小的逻辑部分。观点应该是愚蠢的;这意味着他们不应该真正做任何逻辑或思考。这样事情就会变得更容易,并且可以确保你的观点不会变成怪物。

示例解决方案演练

尝试这个:

创建一个名为 _ 的新 PartialView员工性别.cshtml与您正在使用的视图位于同一文件夹中。

使用此代码

_EmployeeGender.cshtml

@model BusinessLayer.Employee

<tr>
    <td>
    @{

        var listItems = new List<SelectListItem>()
        {
            new SelectListItem {Text = "Male",   Value = "M"},
            new SelectListItem {Text = "Female", Value = "F"}
        };

        @Html.DropDownListFor(m => m.Gender, listItems, string.Empty)
    }  

    </td>
</tr>

你原来的看法

@model IEnumerable<BusinessLayer.Employee>
@{
    ViewBag.Title = "Employees";
}

<h2>Employees</h2>

<table>
    @foreach (var employee in Model) 
    {
        Html.RenderPartial("_EmployeeGender", employee);
    }
</table>

Results

让我们看看我们的生成的 HTML now:

<table>
<tr>
    <td>
<select id="Gender" name="Gender"><option value=""></option>
<option selected="selected" value="M">Male</option>
<option value="F">Female</option>
</select>  

    </td>
</tr><tr>
    <td>
<select id="Gender" name="Gender"><option value=""></option>
<option value="M">Male</option>
<option selected="selected" value="F">Female</option>
</select>  

    </td>
</tr></table>

我们可以看到现在有一​​个空白选择,并且我们的下拉框会根据员工的值自动选择(我创建了一名男性员工和一名女性员工)。

Do Note认为id and nameHTML 属性是相同的。如果您想提交包含这些值的表单,则需要更多工作。但这对您来说是一个合理的起点。

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

@Html.DropDownList基本用法 的相关文章

随机推荐

  • 将blob发送到pythonflask然后保存

    所以我正在尝试制作一个记录你的声音的网站 问题是当我将 blob 文件或 blob url 发送到 Flask 服务器时 我的 Flask python 代码说没有内容 而它是 我该如何发送blob 因此服务器可以将其保存为文件 media
  • 如何在 XCode 6 iOS 模拟器中运行/录制 iOS 应用程序?

    我可能会犯这个错误 但我正在尝试在 Xcode 6 iOS 模拟器中运行 iOS 应用程序 以便录制该应用程序的视频教程 我已经安装了 xCode 并且可以启动 iOS 模拟器 但似乎无法安装 app 文件 Library Develope
  • Maven增量构建

    我们目前有一个大型 Maven 2 项目 它是许多具有复杂依赖关系的单个独立项目的集合 除了一些用于构建的通用父 POM 之外 最后 我们总是必须将应用程序作为一个整体进行交付 因此我宁愿将其转换为一个或几个大项目 有谁有如何优化大型项目的
  • 我应该为 Spark 选择哪种集群类型? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是 Apache Spark 的新手 刚刚了解到 Spark 支持三种类型的集群 独立 意味着 Spark 将管理自己的集群 YARN 使用
  • 具有 has_many 和 has_one 多态关联的工厂女孩

    我目前正在开发一个项目 我想使用 Factory Girl 创建测试 但我无法使其与多态 has many 关联一起工作 我已经尝试了其他文章中提到的许多不同的可能性 但它仍然不起作用 我的模型看起来像这样 class Restaurant
  • C# 合并两个集合的不同项

    我正在寻找一种高性能的方法来将第二个 ICollection 的不同项目添加到现有的 ICollection 中 我正在使用 NET 4 这应该可以做到 list1 Union list2 Distinct aCustomComparer
  • Spring:根据 XSD 架构验证 REST 控制器

    目前我有 RestController 和以下代码 package be smartask api import be smartask api model NumberValue import be smartask api model
  • 使用 pandas 数据框进行主成分分析

    如何根据 pandas 数据框中的数据计算主成分分析 Most sklearn http scikit learn org stable 对象一起工作pandas数据框很好 这样的东西对你有用吗 import pandas as pd im
  • 使用maven仅将资源打包为jar

    我只想打包目录下的资源src main resources放入maven发布的jar中 有没有办法做到这一点 尝试以下操作
  • 代码镜头切换快捷键?

    我非常喜欢 VS2013 中的新代码镜头 但我觉得它具有侵入性 并且希望能够使用键盘打开和关闭它 我想知道是否有人知道允许我打开和关闭它的快捷方式或扩展 我搜索了谷歌和一些论坛 但找不到任何东西 我假设这还不存在 因为我有 0 个结果 但我
  • 并发环境中的幂等 PUT

    Context 我有一个 REST API 多个客户端 应用程序 可以使用 PUT 更新资源的状态 例如 该资源是一盏可以打开的灯ON or OFF 当系统检测到发生停电时 该资源也会自动更新 导致灯坏了 BROKEN状态 我想区分一下BR
  • Neuroph 神经网络帮助

    在我的研究生研究中 我正在创建一个训练识别图像的神经网络 我要做的事情比像许多示例那样仅采用 RGB 值网格 下采样并将它们发送到网络的输入要复杂得多 实际上 我使用了 100 多个独立训练的神经网络来检测线条 阴影图案等特征 更像人眼 而
  • 创建一个指向端口非80的IP的域名

    我想使用域名来指向本地服务器IP地址上的网页 然而 问题是该页面链接到端口 8088 而不是 80 上设置的 IP 地址 因为后者已被另一个网页使用 域名公司告诉我他们不能这样做 因为域名只能指向在端口 80 上设置的 IP 地址 所以现在
  • 什么是 redzone_checker?在 GPU 上分析我的张量流应用程序

    我正在使用 NVIDIA 的命令行 Visual Profiler nvprof 分析一个张量流 GPU 应用程序 其中一个已启动且在分析中非常活跃的内核是名为 redzone checker 的东西 我一生都无法在互联网上的任何地方找到任
  • 将文件上传选择限制为特定类型

    无论如何 通过限制文件类型的选择
  • 如何使用ansible输入私钥密码

    我有流浪者virtual machine跑步 I can ssh进入它使用ssh email protected cdn cgi l email protection然后它会询问我私钥的密码 我可以输入该密码 然后它就会让我登录 但如果我使
  • 如何从 YouTube 获取播放列表视频

    我正在编写一个我想要的应用程序获取 YouTube 视频列表 我可以通过使用特定用户的帐户来做到这一点 如下链接所示 HttpUriRequest request new HttpGet http gdata youtube com fee
  • Jest 遇到意外标记 - SyntaxError:意外标记“导出”

    我正在使用 jest 来测试 React TypeScript 应用程序 这是我正在运行的测试 import render screen from testing library react import toBeInTheDocument
  • 我应该如何在 Wordpress 中使用准备好的语句和查询中的变量?

    我目前正在学习 Wordpress 和 PHP 我也在使用 WooCommerce 我目前有一个包含三个输入字段的表单 我想检查用户输入的有关其订单的数据是否正确 以便用户可以继续进入下一页 我当前的代码如下所示 我不确定我是否走在正确的方
  • @Html.DropDownList基本用法

    我刚刚开始学习 MVC4 我必须承认 对 lambda 表达式 泛型和匿名类型的依赖给我带来了一些挑战 特别是当有许多重载函数时 尝试理解 HTML 帮助程序的工作原理有点令人困惑 以 DropDownListFor 帮助程序为例 我试图从