Правильный способ получения большого количества данных из метода - PullRequest
2 голосов
/ 03 августа 2011

В проекте 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 ]

3 голосов
/ 03 августа 2011

Несмотря на то, что вы не используете шаблон MVC правильно, в общем, есть много способов вернуть несколько вещей из метода.Обычно один из:

  • Использование out параметров (как вы сделали выше)
  • Возвращение Tuple для хранения нескольких элементов
  • Определение и возврат оболочкиclass для хранения нескольких элементов в своих свойствах (это классически «лучшая практика»)
  • Возвращает dynamic и / или ExpandoObject

Возможно, есть ещео котором я не могу думать сейчас ...

1 голос
/ 03 августа 2011

Вы должны создать объект значения для хранения ваших данных, которые будут возвращены. У меня есть коллега-программист, который говорит, что «наши параметры для соседей и студентов». Не в обиду студентам колледжа и девчонкам, но я склонен согласиться с мнением ... Я не использую параметры НИКОГДА.

Самый простой способ решить вашу проблему - это:

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. Надеюсь это поможет. Если вы уже все это знали, извините за изложение «очевидного». (избавьтесь от своих параметров!)

ДРУГОЕ РЕДАКТИРОВАНИЕ:

Если вы пытаетесь заставить это работать с 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 %> - ваш список строк.

1 голос
/ 03 августа 2011

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