我有一个循环,我需要使用2 IEnumerable中的值,我需要获取“标签”的当前索引和值,因此我可以为每个标签打印出labelname。
public static string CheckBoxList(this HtmlHelper htmlhelper, IEnumerable<string> values, IEnumerable<string> labels, string name, IDictionary<string, object> HtmlAttributes)
{
if (labels == null)
return "";
StringBuilder sb = new StringBuilder();
string[] modelValues = new string[] {};
ModelState modelState;
if(htmlhelper.ViewData.ModelState.TryGetValue(name, out modelState)) {
modelValues = ((string[])modelState.Value.RawValue);
}
foreach(string s in values)
{
bool isChecked = modelValues.Contains(s);
sb.Append(CreateCheckBox(name, s, isChecked, HtmlAttributes));
sb.Append(" <label for=\"" + name + "\"> " + labels + "</label><br />");
}
return sb.ToString();
}
如何在该循环中打印出“标签”的当前值?另外我需要“索引”,需要为复选框建立一个唯一的ID,这样标签才能正常工作。
提前致谢。 / M
答案 0 :(得分:2)
我假设值和标签包含相同数量的值,并且它们以第一个值对应于第一个标签的方式排序,依此类推。如果是这种情况,您可以为每个IEnumerable<string>
对象获取一个枚举器,并使用枚举器迭代集合。此外,您可以添加一个为每次迭代递增的int变量,并将其用于创建唯一ID:
public static string CheckBoxList(this HtmlHelper htmlhelper, IEnumerable<string> values, IEnumerable<string> labels, string name, IDictionary<string, object> HtmlAttributes)
{
if (labels == null)
return "";
StringBuilder sb = new StringBuilder();
string[] modelValues = new string[] { };
ModelState modelState;
if (htmlhelper.ViewData.ModelState.TryGetValue(name, out modelState))
{
modelValues = ((string[])modelState.Value.RawValue);
}
IEnumerator<string> valueEnumerator = values.GetEnumerator();
IEnumerator<string> labelEnumerator = labels.GetEnumerator();
int index = 0;
while (valueEnumerator.MoveNext() && labelEnumerator.MoveNext())
{
bool isChecked = modelValues.Contains(valueEnumerator.Current);
sb.Append(CreateCheckBox(name, valueEnumerator.Current, isChecked, HtmlAttributes));
sb.Append(string.Format(" <label for=\"{0}\" id=\"label-{1}\">{2}</label></br>", name, index, labelEnumerator.Current);
index++;
}
return sb.ToString();
}
答案 1 :(得分:0)
如果你想使用foreach循环,那么你需要这样的东西:
int i = 0;
foreach (string s in values) {
bool isChecked = modelValues.Contains(s);
sb.Append(CreateCheckBox(name, s, isChecked, HtmlAttributes));
sb.Append(" <label for=\"" + name + "\"> " + labels.ElementAt(i) + "</label><br />");
i++;
}
然而,在这种情况下,for
循环可能更好
// IEnumerable doesn't have Count property so you need to use Count()
// extension method from System.Linq namespace.
int length = values.Count();
for (int i = 0; i < length; i++) {
bool isChecked = modelValues.Contains(values.ElementAt(i));
sb.Append(CreateCheckBox(name, values.ElementAt(i), isChecked, HtmlAttributes));
sb.Append(" <label for=\"" + name + "\"> " + labels.ElementAt(i) + "</label><br />");
}