【问题标题】:ASP.NET MVC 2 strongly typed htmlhelper, indexesASP.NET MVC 2 强类型 htmlhelper,索引
【发布时间】:2026-02-21 02:00:01
【问题描述】:
public class Foo { public bool Checked {get;set;}}

查看:

<viewdata model="Foo[] fooList" />
<for each="var f in fooList">
    ${Html.CheckBoxFor(x=>x[fIndex].Checked)}
</for>

将输出:

<input id="Checked" name="Checked" type="checkbox" value="true" />
<input name="Checked" type="hidden" value="false" />

<input id="Checked" name="Checked" type="checkbox" value="true" />
<input name="Checked" type="hidden" value="false" />

<input id="Checked" name="Checked" type="checkbox" value="true" />
<input name="Checked" type="hidden" value="false" />

问题是System.Web.Mvc.ExpressionHelper.GetExpressionText 没有在 id/name 中包含索引。

如果我想为每个复选框添加标签,这会导致问题(因为所有 id 都是相同的)。

任何想法如何正确处理?


来自 MVC 源=>

 while (part != null) {
            if (part.NodeType == System.Linq.Expressions.ExpressionType.MemberAccess) {
                MemberExpression memberExpressionPart = (MemberExpression)part;
                nameParts.Push(memberExpressionPart.Member.Name);
                part = memberExpressionPart.Expression;
            }
            else {
                //arghhhh... [index] != MemberAccess :(
                break;
            }
        }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    基于表达式的助手理解索引的能力尚不包含在产品中。它将在下一个预览版本中(无论是 MVC 2 RC 之后的版本)。见http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4970

    【讨论】:

      【解决方案2】:

      使用允许您指定 html 属性的 CheckBoxFor 重载:

      CheckBoxFor(TModel)(HtmlHelper(TModel), Expression(Func(TModel, Boolean)), IDictionary(String, Object))
      

      例如,

      ${Html.CheckBoxFor(x => x[fIndex].Checked, new { id = "foo" + fIndex) })}
      

      【讨论】:

      • 这不是正确。在这种情况下——让我问一下CheckBoxFor 'strongly-typed' 辅助方法有什么好处,如果我不能从视图模型中取回该 id 而不会弄乱硬编码的字符串?这与使用 ${Html.CheckBox("foo"+fIndex,m.AllCatalogs[i].Checked)} 相同,甚至看起来更好。