2

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

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

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

在我这样使用的视图中:

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

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

4

3 回答 3

3

尽管您没有正确使用 MVC 模式,但总的来说,有很多方法可以从一个方法返回多个内容。通常是以下之一:

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

可能还有更多我现在想不出来的...

于 2011-08-02T20:52:55.797 回答
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;
于 2011-08-02T20:48:38.177 回答
1

您应该创建一个值对象来保存要返回的数据。我有一个程序员同事说“输出参数适用于青少年和大学生”。对大学生和青少年没有冒犯,但我倾向于同意这种观点......我永远不会使用参数。

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

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. 这意味着它不会返回任何东西。是的,有 out 参数,但您可能已经删除了它们。:) 而不是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 %>是您的字符串列表。

于 2011-08-02T20:59:27.657 回答