我的函数无法输出字符串数组

本文关键字:字符串 数组 输出 函数 我的 | 更新日期: 2023-09-27 18:21:52

我认为答案很明显,但现在是星期五,所以我的大脑没有完全运作。

我正在一个 asp.net mvc 应用程序中工作,我在其中获取所选行的 id。每次单击一行时,该行的 id 都会发送到我的控制器。

我想做的是将id输出为常规纯文本。这并不难,我使用以下代码:

public string GetInformation(int id)
        {
           return id.toString();
        }

但是用户可以一次选择多行,现在发生的事情是 id 只是从第一选定的行更改为第二行。

我想要的是返回两个 id,用逗号分隔。

这是我尝试过的:

public string[] GetInformation(int id)
        {
            List<string> oud = new List<string>();
            oud.Add(id.ToString());
            return oud.ToArray();
        } 

但它只是将System.String[]显示为输出。

我的函数无法输出字符串数组

好的,我将通过说我认为使用状态会话通常是一个坏主意来作为前缀。但是,这是显示状态管理和保留请求之间的列表的简单方法。

将您的函数更新为:

        public string[] GetInformation(int id)
        {
            var list = Session["oud"] as List<string>;
            if (list == null)
            {
                list = new List<string>();
                Session["oud"] = list;
            }
            list.Add(id.ToString());
            return list.ToArray();
        }

每次调用此方法时,它都会从会话(用户状态管理(中获取列表。如果从会话返回的列表为 null(实际上并不存在(,我们将创建一个新的字符串列表并将其添加到会话中。

为了测试这一点,我在返回 View(( 之前将以下内容放在 MVC 控制器的索引操作中。当我刷新页面时,我可以看到随机 id 被附加到列表中。如果您从客户端拨打电话,则同样适用。

        Random r = new Random();
        GetInformation(r.Next(1, 10));

希望这有帮助!


更新

在 razor 视图中循环访问数组并打印每个项目

在 razor 视图中,如果已将此数组作为 MyIds 添加到模型中,则可以使用以下方法:

@foreach (var id in Model.MyIds)
{
    <p>@Html.Raw(id)</p>
}

更新 2

我将为您简化此操作:

        public string GetInformation(int id)
        {
            var list = Session["oud"] as List<string>;
            if (list == null)
            {
                list = new List<string>();
                Session["oud"] = list;
            }
            list.Add(id.ToString());
            return string.Join(", ", list);
        }

该函数现在返回已传递的 id 的逗号分隔列表。

但是它只是显示System.String[]作为输出。

好吧,你没有向我们展示你是如何实际输出任何东西的。 但大概你会得到一个值:

var output = GetInformation(input);

然后尝试直接将output写为string. 但是,string[]是一个数组,没有默认的字符串表示形式。 .NET 中没有.ToString()实现的所有对象都从 System.Object 继承其实现,默认输出类型名称。

而不是输出对象本身,这在语义上是这样的:

Write(output)

(同样,从语义上讲,因为我们不知道你实际上是如何输出它的,所以考虑这个伪代码(

循环访问它以获得您的输出:

foreach (var value in output)
    Write(value)

您必须处理格式设置(新行、分隔符等(,但您希望将值显示为 UI 问题。 但基本上,关键是你需要遍历你的值并单独输出它们,而不是作为一个大数组输出。

如果您愿意,有一些快捷方式可以为您循环。 例如:

Write(string.Join(",", output))

这将为您"连接"output中的所有字符串,使用 "," 作为分隔符。

<小时 />

编辑:您似乎遇到的另一个问题是您的方法只返回一个对象的新列表:

public string[] GetInformation(int id)
{
    List<string> oud = new List<string>();
    oud.Add(id.ToString());
    return oud.ToArray();
}

此方法实际上不应负责维护列表。 这是因为该方法本身是无状态的,它真正做的只是将整数值转换为字符串。 (你真的不需要一种方法,但无论如何。 使用代码应保持状态。

因此,请保持该方法原样:

public string GetInformation(int id)
{
    return id.toString();
}

并让使用代码维护值的集合。 像这样:

var output = GetInformation(input);
myOutputs.Add(output);

myOutputs在哪里定义? 好吧,这种状态的维持在哪里取决于很多事情。 这是一个 Web 应用程序,因此状态可能是一件有趣的事情。 有很多地方可以维护它:

  • 在作为方法级变量的消费方法中
  • 在作为类级别值的消费类中
  • 处于会话状态
  • 在数据库中
  • 等。

逻辑和应用程序的整体流程将控制这一点。 例如,如果类的单个实例维护此过程的整个生存期,则可以将其放在类级值中。 但是,如果该值需要跨不同的页面请求保留,则可能需要将其置于会话状态中。 对于在何处维护此字符串集合,有许多选项。

试试这个:

伪代码

public string[] GetInformation(int id)
{
    List<string> oud = new List<string>();
    oud.Add(id.ToString());
    return oud.ToArray();
} 
var myResult = GetInformation(1);
Console.WriteLine(string.Join(", ", myResult);

返回未格式化的数据并在需要时对其进行格式化会更好。

public int[] GetInformation(int id)
{
    List<int> oud = new List<int>();
    oud.Add(id);
    return oud.ToArray();
} 
var myResult = GetInformation(1);
Console.WriteLine(string.Join(", ", myResult);