2011-08-02 62 views
2

在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

你的问题意味着你直接从视图调用控制器...? –

+0

是的。但总的来说,只是一种从方法调用中检索多个值的方法。 – Odys

+2

你可能应该多读一些关于MVC是如何工作的。控制器应该返回一个ViewResult和视图的模型数据,然后视图访问模型。视图不应直接访问控制器。 –

回答

3

尽管你没有使用正确的MVC模式,在一般情况下,有很多的方法可以从一个方法返回多个事情。通常为1:

  • 使用out参数(如上面一样)
  • 返回Tuple持有多个项目
  • 定义,并返回一个包装class在其属性持有多个项目(这是经典的“最佳实践”)
  • 返回dynamic和/或ExpandoObject

有可能更多,我不能TH现在的墨水...

+0

对于包装类/响应类/值对象为+1。 – Deleted

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

一个伟大的原则进行的拇指,我从鲍勃·马丁的书,“清洁守则”据悉,是这样的:如果有要返回的数据,将其返回。如果您有多个返回类型的日期,请将它们加载到包装类中。它会让你的生活更轻松,而下一个必须查看你的代码的人将会花更少的时间来挠头。

编辑:

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

ANOTHER编辑:

如果你试图与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 %>是您的字符串列表。

相关问题