问题
public class Foo { public bool Checked {get;set;}}
View:
<viewdata model="Foo[] fooList" />
<for each="var f in fooList">
${Html.CheckBoxFor(x=>x[fIndex].Checked)}
</for>
Will output:
<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" />
Problem is that System.Web.Mvc.ExpressionHelper.GetExpressionText
does not include index in id/name.
That leads to problems in case I want to add a label for every checkbox (because all id`s are the same).
Any ideas how to handle this properly?
From the MVC source=>
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;
}
}
回答1:
The ability of the expression-based helpers to understand indexes isn't in the product yet. It will be in the next preview release (whatever comes after MVC 2 RC). See http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4970.
回答2:
Use the CheckBoxFor overload that allows you to specify html attributes:
CheckBoxFor(TModel)(HtmlHelper(TModel), Expression(Func(TModel, Boolean)), IDictionary(String, Object))
For example,
${Html.CheckBoxFor(x => x[fIndex].Checked, new { id = "foo" + fIndex) })}
来源:https://stackoverflow.com/questions/2093216/asp-net-mvc-2-strongly-typed-htmlhelper-indexes