MVC имеет дело с несколькими запросами LINQ в одном представлении - PullRequest
0 голосов
/ 26 октября 2011

Теперь я понимаю, что на этот вопрос уже был дан ответ, но я просто не могу обернуться вокруг него и заставить его работать в моем примере:

Просмотр
должно содержать 2 цикла foreach fx
foreach (элемент var в Model.ListA)
foreach (элемент var в Model.ListB)

Model
должен содержать классс объектом LinqDataContext и двумя свойствами: (ListA и ListB)

Контроллер
должен пропускать модель через представление.


Как будет модельа контроллер смотрит на это?Несколько простых примеров кода были бы очень полезны :)

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Вау, заполнение LinqDataContext для View пахнет довольно плохо.Зачем вам это делать?

Контроллер должен получить все необходимые данные либо из указанного LinqDataContext, либо из серверной службы, а затем создать простой ViewModel, содержащий только IList или IEnumerable.

public class YourViewModel 
{
    public List<A> ListA {get; set;}
    public List<B> ListB {get; set;}
}

public ActionResult YourControllerAction()
{
   var context = yourDataContext;

   var model = new YourViewModel
   {
      ListA = context.TableA.Where(x => x.Something)
                     .Select(x => x.ConvertSqlToBusinessObject()).ToList(),
      ListB = context.TableB.Where(x => x.Something)
                     .Select(x => x.ConvertSqlToBusinessObject()).ToList()
   };

   return View("Index",model);
}
1 голос
/ 26 октября 2011

У вас это немного отсталый.Ваш контекст данных должен находиться в контроллере (желательно на уровне, который даже ниже, чем контроллер).Вы всегда хотите, чтобы ваш контроллер отвечал за получение / обновление данных и заполнение модели.Затем модель доставляется в представление со всем необходимым для представления этих данных.

public class MyModel
{
    public List<ListAEntity> ListA {get;set;}
    public List<ListBEntity> ListB {get;set;}
}


public class HomeController : Controller
{
    private readonly MyDataContext _context = new MyDataContext();

    public ActionResult Index()
    {
        var model = new MyModel()
        {
            ListA = _context.Get<ListAEntity>().ToList(),
            ListB = _context.Get<ListBEntity>().ToList()
        };

        return View(model);
    }
}
0 голосов
/ 02 января 2013

Я бы добавил небольшое дополнение к предыдущим ответам: контроллер должен реализовать логику, необходимую для выбора правильного представления и модели представления, однако он НЕ должен заполнять модель представления.Модель представления вполне способна заполнить себя.

Этот шаблон улучшает инкапсуляцию как контроллера, так и модели представления, а также создает более четкое разграничение между проблемами.Таким образом, если я украду фрагмент кода Майкла:

В контроллере

public ActionResult YourControllerAction(){
   MyDbContext context = new MyDbContext();
   return View("YourControllerAction", new YourViewModel(context));
}

В представлении модели

public class YourControllerAction {
    public YourControllerAction(MyDbContext context) {
         ListA = context.TableA.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
         ListB = context.TableB.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...