代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

ASP.NET MVC 2强类型htmlhelper,索引

  •  3
  • Eli Bendersky  · 技术社区  · 6 年前
    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;
                }
            }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Levi    15 年前

    基于表达式的帮助程序理解索引的能力还不在产品中。它将在下一个预览版中发布(MVC2 RC之后的版本)。见 http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4970 .

        2
  •  0
  •   Ajw    15 年前

    使用允许您指定HTML属性的重载复选框:

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

    例如,

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