使用Razor返回数组中的字符串

时间:2014-07-28 17:39:50

标签: c# asp.net-mvc asp.net-mvc-4 razor

我从我的模型中获取了一个字符串[],并且在任何给定时间它都有大约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呈现实际的字符串值。

2 个答案:

答案 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());
        }