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

本文关键字:字符串 数组 Razor 返回 使用 | 更新日期: 2023-09-27 18:15:10

我从我的模型中取一个字符串[],它在任何给定的时间都有大约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个"系统"复选框。对象[]"标签。

最终,我将想要返回任何检查字符串返回到模型,但现在我只想知道如何让Razor呈现实际的字符串值。

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

不要在razor中使用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])或其他类似的来满足您的需要

我的情况非常具体,所以我认为这并不适用于任何人。我有一个Object[],里面有很多对象,我想用Razor将每个子对象显示为字符串。我使用了一种技巧将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());
        }