在foreach循环中的第一个对象上以不同方式设置RouteValueDictionary html属性

本文关键字:方式 设置 RouteValueDictionary 属性 html 循环 foreach 一个对象 | 更新日期: 2023-09-27 18:19:50

我有一个相当大的方法,它从根本上基于枚举返回单选按钮。

foreach (var name in names) 
    {
    //other stuff
        var id = string.Format(
        "{0}_{1}_{2}",
        htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
        metaData.PropertyName,
        name
        );
        var attribs = new RouteValueDictionary(htmlAttributes) { { "id", id }, { "checked", true } }; //<- I want this to be true on first, false on everything after
        var radio = htmlHelper.RadioButtonFor(expression, name, attribs).ToHtmlString();
        var field = fields.Single(f => f.Name == name);
    //more stuff
    }

在我进入循环之前,我正在按一定的顺序排列我的数组names,该顺序规定,当最终呈现到我的页面时,应该检查第一个单选按钮,这就是我正在努力解决的问题,因为它正在检查for each中的每一个项目,导致最后一个要检查的项目是剩下的那个。

我试着添加了一些类似的内容:

bool firstRadioButton = true;

然而,当我开始将它们放在if statements内部时,我失去了对attribs等的引用,并且如果没有它们在if statements外部所需的参数,我似乎无法声明它们。

有人能提出一种方法吗?我只能在foreach的第一次通过时将attribs的checked设置为true

在foreach循环中的第一个对象上以不同方式设置RouteValueDictionary html属性

目前尚不清楚您使用firstRadioButton做了什么,但类似的操作应该可以:

bool firstRadioButton = true;
foreach (var name in names) 
{
    // ....
    RouteValueDictionary attribs = null;
    if (firstRadioButton) 
    {
        attribs = new RouteValueDictionary(htmlAttributes) { { "id", id }, { "checked", true } }; //<- I want this to be true on first, false on everything after
        firstRadioButton = false;
    }
    else 
    {
        attribs = new RouteValueDictionary(htmlAttributes) { { "id", id }};
    }
    // ...
}

使用foreach循环for

for (int i = 0; i < names.length; i++) 
{
        var name = names[i];

        var id = string.Format(
        "{0}_{1}_{2}",
        htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
        metaData.PropertyName,
        name
        );
        var attribs = new RouteValueDictionary(htmlAttributes) { { "id", id }, { "checked", i == 0 ? true : false} }; 
        var radio = htmlHelper.RadioButtonFor(expression, name, attribs).ToHtmlString();
        var field = fields.Single(f => f.Name == name);
}

或者在foreach中,您可以进行

    bool isFirst = true;
    foreach (var name in names) 
    {
            var id = string.Format(
            "{0}_{1}_{2}",
            htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
            metaData.PropertyName,
            name
            );
            var attribs = new RouteValueDictionary(htmlAttributes) { { "id", id }, { "checked", isFirst} }; 
            var radio = htmlHelper.RadioButtonFor(expression, name, attribs).ToHtmlString();
            var field = fields.Single(f => f.Name == name);
            if(isFirst)
            {
               isFirst = false;                
            }
   }