我的函数不能输出字符串数组

时间:2015-11-13 14:44:05

标签: c# asp.net

我认为这个问题的答案非常明显,但是星期五,所以我的大脑并没有完全发挥作用。

我正在使用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[]作为输出。

3 个答案:

答案 0 :(得分:3)

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

将您的功能更新为:

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

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

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

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

希望这有帮助!

更新

在剃刀视图中迭代数组并打印每个项目

在剃刀视图中,如果您已将此数组添加到模型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已经传递的列表。

答案 1 :(得分:2)

  

但是它只显示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))

那会&#34;加入&#34; <{1}}中的所有字符串,使用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); 在哪里定义?那么,维持这种状态取决于很多事情。这是一个Web应用程序,因此 state 可能是一件有趣的事情。有很多地方可以维护它:

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

逻辑和应用程序的整体流程将决定这一点。例如,如果该类的单个实例维护此进程的整个生命周期,那么您可以将其放在类级别值中。但是,如果值需要在不同的页面请求中持续存在,那么您可能希望将其置于会话状态中。您可以通过多种方式来维护此字符串集合。

答案 2 :(得分:-1)

试试这个:

PSEUDO CODE

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);