在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);
我不喜欢这种做法。如何在不使用数据包装类的情况下以更漂亮的方式检索数据?
答案 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 %>
是您的字符串列表。