从一个方法中获得大量数据的正确方法

本文关键字:方法 数据 一个 | 更新日期: 2023-09-27 18:04:32

在MVC项目中,在我的控制器中,我想获得在视图中使用的数据。假设我想检索一个List<string>和一个int

我的控制器的方法声明与此类似。

void GetFooData(int id, out List<string> listData, out int aValue);

在视图中,我使用的是as:

List<string> data;
int value;
controller.GetFooData(myId, data, value);

我不喜欢这种方法。如何在不使用数据包装器类的情况下以更美观的方式检索数据?

从一个方法中获得大量数据的正确方法

尽管你没有正确使用MVC模式,一般来说,有很多方法可以从一个方法返回多个东西。通常为:

  • 使用out参数(如上所述)
  • 返回一个Tuple来保存多个项目
  • 定义并返回一个包装器class,以在其属性中容纳多个项目(这通常是"最佳实践")
  • 返回dynamic和/或ExpandoObject

可能还有更多我现在想不起来的……

在。net 4.0中,您可以使用Tuple,尽管这并没有太大的改进。

Tuple<List<String>, int> GetFooData(int id) {
    ...
    return Tuple.Create(list, intVal);
}

var pair = controller.GetFooData(myId);
var data = pair.Item1;
var value = pair.Item2;

您应该创建一个值对象来保存要返回的数据。我有一个程序员同事说:"我们的参数是给小孩子和大学生用的。"无意冒犯大学生和年轻人,但我倾向于同意这种观点……我从不使用我们的参数。

解决手头问题的最干净的方法是这样的:

public class FooData
{
    public List<string> Strings { get; set; }
    public int MyInt { get; set; }
}
public FooData GetFooData(int id)
{
    var fooStrings = _stringRepository.GetFooStrings(id); 
    //or wherever you're getting your data from
    return new FooData
                {
                    Strings = fooStrings,
                    MyInt = id, //or whatever the int prop is supposed to be
                };
}

我从Bob Martin的书《Clean Code》中学到的一条经验法则是:如果有数据要返回,就返回它。如果要返回的日期类型不止一种,请将它们装入包装器类中。这会让你的生活更轻松,下一个要看你代码的人会花更少的时间挠头。

编辑:

如果你是c#的新手,我想我应该添加一点解释。您的方法从void开始。这意味着它不返回任何东西。是的,有我们的参数,但你可能已经删除了它们。:)代替void,你的方法需要返回一个类型。如果您只有一种类型的数据要返回,如List<string>,您可以说List<string> GetFooData(int id),等等。在上面的示例中,我将名为FooData的新类/类型添加到方法中,以便它返回FooData。希望这对你有所帮助。如果你已经知道了这些,那么很抱歉我说的是"显而易见的"。(去掉你的out参数!)

另一个编辑:

如果你想让这个工作与ASP。NET MVC,正如其他评论者建议的那样,你应该用"MVC"的方式来做。如果你有一个需要数据的视图,给它一个这样的视图模型:

public ViewResult SomeViewWithFooData(int id)
{
    var fooStrings = _stringRepository.GetFooStrings(id); 
        //or wherever you're getting your data from
    var fooData = new FooData
                    {
                        Strings = fooStrings,
                        MyInt = id, //or whatever the int prop is supposed to be
                    };
    return new View(fooData);  
}

然后,你可以有一个名为SomeViewWithFooData的视图,它继承自System.Web.Mvc.ViewPage<FooData>。在视图中,只需调用Model来获取数据。此时,Model的类型为FooData。

<%=Model.MyInt %>是从控制器动作传递给视图的int值。

<%=Model.Strings %>是您的字符串列表。