从一个方法中获得大量数据的正确方法
本文关键字:方法 数据 一个 | 更新日期: 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 %>
是您的字符串列表。