我从我的模型中获取了一个字符串[],并且在任何给定时间它都有大约25个字符串。
@model PostProcessPartSelectionViewModel
@{
var i = 0;
foreach (var part in Model.PartsAllowedAsSeed)
{
<input type="checkbox" id="[@i]" name="PartsAllowedAsSeed" value="@part" />
<span>@part</span>
<br />
i++;
}
}
我在Razor中设置了@foreach循环,为每个字符串显示一个复选框和标签,但是当我调试时,@ part渲染到System.Object []。有25个“System.Object []”标签的复选框。
最终,我想要将任何已检查的字符串返回给模型,但是现在我只想知道如何让Razor呈现实际的字符串值。
答案 0 :(得分:2)
不要在剃须刀中使用foreach
,请使用for
循环,以便直接绑定到您的模型:
@for (int i = 0; i < @Model.PartsAllowedAsSeed.Length; i++)
{
<input type="checkbox" id="[@i]" name="PartsAllowedAsSeed" />
<span> @Model.PartsAllowedAsSeed[i] </span>
<br />
}
至于您的System.Object[]
,您可以string.Join(", ", @Model.PartsAllowedAsSeed[i])
或某些等同于满足您需求的
答案 1 :(得分:0)
我的案子很具体,所以我认为这不适用于任何人。我有一个包含对象的Object [],我想用Razor将每个子对象显示为一个字符串。我使用hack将Object []强制转换为列表,然后在每个列表条目中附加括号,并将每个字符串报告回Razor。现在,我不需要直接绑定到模型,所以我选择使用foreach。
剃刀代码:
@{
var i = 0;
@foreach (var item in Model.PartsAllowedAsSeed)
{
<input type="checkbox" id="@i" name="PartsAllowedAsSeed" />
<span>@Html.ConvertToArray(item)</span>
<br />
i++;
}
}
助手类:
public static MvcHtmlString ConvertToArray(this HtmlHelper htmlHelper, object source)
{
var src = source as IEnumerable;
if (src == null) return MvcHtmlString.Create(string.Empty);
var sourceAsList = src.Cast<Object>().ToList();
var output = new StringBuilder();
output.Append("[");
for (var index = 0; index < sourceAsList.Count; index++)
{
var item = sourceAsList[index];
output.Append(item);
if (index != (sourceAsList.Count - 1)) output.Append(", ");
}
output.Append("]");
return MvcHtmlString.Create(output.ToString());
}