从方法中获取大量数据的正确方法

时间:2011-08-02 20:43:16

标签: c# model-view-controller controller out

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

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

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

在我正在使用的视图中:

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

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

3 个答案:

答案 0 :(得分:3)

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

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

我现在可能还有更多想法......

答案 1 :(得分:1)

使用.NET 4.0,您可以使用元组,但这并没有太大的改进。

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;

答案 2 :(得分:1)

您应该创建一个值对象来保存要返回的数据。我有一个同事程序员,他说“参数适用于维纳和大学生”。对大学生和小人没有冒犯,但我倾向于同意这种情绪......我没有使用参数EVER。

解决手头问题的最简洁方法是:

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的书“清洁代码”中学到的一个很好的经验法则是:如果有要返回的数据,请将其返回。如果要返回多种类型的日期,请在包装类中加载它们。它会让你的生活变得更轻松,下一个不得不看你的代码的人会花更少的时间挠头。

编辑:

如果你是C#的新手,我想我会补充一点解释。您的方法以void开头。这意味着它不会返回任何东西。是的,有参数,但你可能已经删除了它们。 :)而不是void,您的方法需要返回一个类型。如果您只返回一种类型的数据,例如List<string>,则可以说List<string> GetFooData(int id)等。在上面的示例中,我向方法中添加了名为FooData的新类/类型这样它就会返回FooData。希望这可以帮助。如果你已经知道了这一切,抱歉说明“显而易见”。 (摆脱你的参数!)

另一个编辑:

如果您正在尝试使用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 %>是您的字符串列表。