加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – @ Html.DropDownListFor基本用法

发布时间:2020-12-15 06:39:24 所属栏目:百科 来源:网络整理
导读:我刚刚开始学习MVC4,我必须承认,我对所有依赖lambda表达式,泛型和匿名类型的挑战,尤其是当有很多重载函数时,我都有所挑战.尝试了解 HTML Helpers的工作原理有点混乱.以“DropDownListFor”帮助器为例.我试图从我的代码中提取要点.这就是为什么在表中只看到一
我刚刚开始学习MVC4,我必须承认,我对所有依赖lambda表达式,泛型和匿名类型的挑战,尤其是当有很多重载函数时,我都有所挑战.尝试了解 HTML Helpers的工作原理有点混乱.以“DropDownListFor”帮助器为例.我试图从我的代码中提取要点.这就是为什么在表中只看到一列“Gender”.希望它在语法上是正确的:
@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,一个IEnumerable的Employee,并生成以下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对象,而不是Employees的集合在这里我想显示一个Employees表的列表.我假设DropDownListFor方法的第一个参数的意图是“点/绑定”到模型中的一个属性,所以这就是为什么我做了m => employee.Gender.这是我应该做什么模型是员工而不是单一员工的集合?如果是这样,我很困惑,我如何为两个下拉列表生成唯一的ID,这两个下拉列表都为NAME和ID属性分配了“employee_Gender”.

对于Helper DropDownListFor的第3个参数,

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

这是否合理? employee.Gender的值为“M”或“F”,但显示文本为“Male”和“Female”.我感到困惑的是,这个参数是用来指定默认的“NO SELECT”第一个值还是使用这个参数来从当前员工的下拉列表中选择 – 或者可以同时做两个?例如,它是否选择指定的文本,如果找到,否则添加指定为FIRST的文本?参数如果没有找到值?这似乎是如何从我所看到的.这第三个参数可以简化还是我的例子合理?

感谢您的耐心,阅读我的许多问题,试图更好地了解这一点.

解决方法

第1部分:解释魔法

你不是一个人. Lambdas MVC使编码变得很容易,但它们也使它看起来很神奇(由于抽象).

Looking at the first param of the DropDownListFor Method […] Do I understand correctly that the “m” represents the instance of the model class that was passed into the View?

是.

HTML助手在Razor中的Lambdas是简单而神奇的,因为他们正在采取一个捷径,而不是真正向你透露发生了什么.

首先,我们来看看@Html.我们知道@开始我们的剃刀语法,然后Html是魔术.实际上,Html是一个自动初始化并给你的一个HtmlHelper对象.更具体地说,它是一个HtmlHelper< TModel&gt ;.剃须刀HTML编辑器是聪明的,提前知道什么类型的TModel将基于你所说的这个视图的模型类型.这就是为什么你有这么多的智慧. 当你输入

@model IEnumerable<BusinessLayer.Employee>

编辑器读取并作出假设,现在HTML Helper将是HtmlHelper< IEnumerable< BusinessLayer.Employee>>.当编译页面的时候,HTML助手实际上就是这种类型的(当然).

那么DropDownListFor还是其他的扩展方法呢?

看着DropDownListFor,我们可以看到它实际上是DropDownListFor< TModel,TProperty>.我们现在明白,TModel是我们观点的模型类型. DropDownListFor知道这一点,因为该方法是扩展HtmlHelper< TModel&gt ;.因此,DropDownListFor知道传入类型是视图顶部定义的任何类型. TProperty怎么样? TProperty是返回类型.这是您选择属性时指定的类型.该视图给出了HtmlHelper的模型类型,然后给出了DropDownListFor模型类型,现在你在一个lambda表达式中:(x => x.Property)你选择的属性然后为你选择类型;在这种情况下是一个字符串(Gender).

第2部分:你的问题

在不知道你想要达到的目标的情况下,很难回答你的问题.你有一个Employees的集合,你想为每个显示多个性别下拉框,然后保存?

在处理集合时,这有点更棘手,因为MVC不会很好地处理它们;根据您需要完成的任务,最好编写自己的解决方案.

我不喜欢单一视图在一个页面上收集一些东西的想法.考虑这个逻辑:

你的方式:

>获取员工的收集
给员工一个看法
有视图创建一个SelectListItem
循环并显示每个员工的SelectList

我的方式

>获取员工的收集
>给员工一个看法
>使视图循环遍历并将每个员工传递给另一个视图(部分)
>每个部分处理单个员工

使用MVC,尽量将事情分解成小而合逻辑的部分.意见应该是愚蠢的这意味着他们不应该做任何逻辑或思考.事情变得更容易这样,它确保你的意见不会成长为怪物.

示例解决方案走过

尝试这个:

在与您使用的视图相同的文件夹中创建一个名为_EmployeeGender.cshtml的新PartialView.

使用此代码

_EmployeeGender.cshtml

@model BusinessLayer.Employee

<tr>
    <td>
    @{

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

        @Html.DropDownListFor(m => m.Gender,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>

结果

现在我们来看看我们生成的HTML:

<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>

我们可以看到,现在有一个空白的选择,我们的下拉框被自动选择与雇员的值(我创建一个男性和一个女性员工).

请注意,id和name的HTML属性是一样的.如果你想提交一个具有这些值的表单,那么它将需要更多的工作.但这是一个合理的起点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读