MVC - передача нескольких таблиц данных в представление - PullRequest
7 голосов
/ 30 марта 2011

В настоящее время у меня есть следующий код в HomeController моего проекта MVC:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        return View(j);
    }

Так что все работает хорошо, но теперь я хочу передать вторую таблицу в то же представление.Поэтому я подумал, что должен быть в состоянии сделать что-то вроде этого:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        IQueryable<Table2Data> l =
            from k in dc.Table2        
            select k;

        return View(j, l);
    }

Есть ли способ заставить представление принять две модели, подобные этой, или, альтернативно, способ объединить два набора результатов (две таблицы никак не связаны?

Ответы [ 7 ]

16 голосов
/ 30 марта 2011

Да, есть, но не совсем так. Способ сделать то, что вы хотите сделать, это создать собственный класс ViewModel. Этот класс ( MyPageViewModel ) будет иметь два (или более) свойства, по одному для каждого из ваших объектов. По вашему мнению, вы получите доступ к ним, используя Model.Table1Data и Model.Table2Data.

A пользовательский класс ViewModel это очень просто:

public class MyPageViewModel
{
   public IQueryable<Table1Data> Table1Data { get; set; }
   public IQueryable<Table2Data> Table2Data { get; set; }
}

Вам необходимо представление строго ввести в этот пользовательский класс ViewModel.

<%@ Page Title="MyPage" MasterPageFile="~/Application/Master Pages/Site.Master"
    Inherits="System.Web.Mvc.ViewPage(Of MyAppNamespace.MyPageViewModel)" %>

Не пытайтесь напечатать это сами; проще создать новый вид, проверить «строго типизированный» вид и указать класс New Custom Viewmodel.

Тогда ваш метод действия контроллера будет:

public class HomeController : Controller
{
  public ActionResult Index()
  {
    MyDataContext dc = new MyDataContext();

    MyPageViewModel vm = new MyPageViewModel();

    vm.Table1Data =  from n in dc.Table1                     
                     select n;

    vm.Table1Data = from k in dc.Table2        
                    select k;

    return View(vm);
  }
}
3 голосов
/ 30 марта 2011

Да - создайте новый класс - который вы будете использовать в качестве модели - который содержит обе таблицы:

public class MyModel {
   public IQueryable<Table1Data> Table1Data { get; set; }
   public IQueryable<Table2Data> Table2Data { get; set; }
}

Затем в вашем контроллере инициализируйте этот класс, заполните оба свойства и отправьте его на просмотр. Затем измените представление, чтобы распознать этот новый тип как модель представления.

2 голосов
/ 17 января 2012

Я решил проблему, создав список «таблиц» и передав его в мою модель представления.По сути, это список из списка TransactionEntities.К вашему сведению, мое решение было названо DAL, и в моделях я создал TransactionEntity для представления транзакции.

    private TransactionEntity te;
    private IEnumerable<TransactionEntity> tel1; // A list of TransactionEntities
    private IEnumerable<TransactionEntity> tel2;
    private IEnumerable<TransactionEntity> tel3;
    private IEnumerable<IEnumerable<TransactionEntity>> telCollection;

Я заполняю списки объектов транзакции (tel1, tel2, tel3) моими te 'строками',затем добавьте три объекта 'tel' (например, таблицу) в мою коллекцию telCollection и назначьте ее моему ViewData.Model.

    telCollection = new List<IEnumerable<TransactionEntity>>();
    telCollection = telCollection.Concat(new[] { tel1 });
    telCollection = telCollection.Concat(new[] { tel2 });
    telCollection = telCollection.Concat(new[] { tel3 });
    ViewData.Model = telCollection;
    return View();

В файле ASPX я получаю список и перебираю каждый из них 'table '(ElementAt (#)), создавая три разных столбца, по одному для каждой из таблиц.Кстати, вы можете игнорировать переменную-счетчик.

<td>
   <% int counter = 0; %>
   <% IEnumerable<IEnumerable<DAL.Models.TransactionEntity>> tranlist = 
          (IEnumerable<IEnumerable<DAL.Models.TransactionEntity>>)ViewData.Model; %>

   <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(0))
      {.... create rows/columns as needed for the data in a HTML sub-table ......} %>
 </td>
 <td>
    <% counter = 0; %>
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(1))
      {..........} %>
 </td>
 <td>
    <% counter = 0; %>
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(2))
      {..........} %>
 </td>
2 голосов
/ 30 марта 2011

Почему бы вам не добавить класс в ваших моделях для этого?

public class MyModel {

public j {get; set;}
public l {get; set;}

}

Затем вы передаете MyModel представлению на голове представления.

На контроллере:

публичный указатель ActionResult () {MyDataContext dc = new MyDataContext ();

    IQueryable<Table1Data> j =
        from n in dc.Table1                     
        select n;

    IQueryable<Table2Data> l =
        from k in dc.Table2        
        select k;

    MyModel myclass = new MyModel();
    myclass.j = j;
    myclass.l = l;

    return View(myclass);
}
1 голос
/ 30 марта 2011

Вы можете сделать их обоих в одной ViewModel:

Определение модели:

public class YourModelName
{
       public IQueryable<Table1Data> FirstTableData { get; set;}
       public IQueryable<Table2Data> SecondTableData { get; set;}

       public YourModelName(IQueryable<Table1Data> d1, IQueryable<Table2Data> d2)
       {
            this.FirstTableData = d1;
            this.SecondTableData = d2;
       }
}

Использование (в контроллере):

public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        IQueryable<Table2Data> l =
            from k in dc.Table2        
            select k;

         YourModelName model = new  YourModelName(j, l);

        return View(model);
    }
0 голосов
/ 30 марта 2011

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

class NewViewModel {
    Table1 T1 {get;set;}
    Table2 T2 {get;set;}
    int Anything {get;set;}
}

Затем вы просто готовите коллекцию этих классов ViewModel и позже получаете доступ к их экземплярам, ​​например:

NewViewModel m = new NewViewModel();
var a = m.T1.PropertyA;
var b = m.T2.PropertyB;

и т. Д. Просто объедините все необходимые сущности в один класс и используйте этот класс в качестве модели в Controller и View.

0 голосов
/ 30 марта 2011

В pre-MVC3 я бы использовал ViewModel и добавил свойства для каждого объекта, который вы хотите использовать для представления.Если вы используете MVC3, я бы взглянул на ViewBag .

Модель простого представления:

public class SomeViewModel
{
   public object Object1 { get; set; }
   public string Message { get; set; }
}

Тогда в вашем контроллере вы передадите этона ваш взгляд:

var vm = new SomeViewModel { Object1 = coolThing, Message = neatMessage };
return View(vm);
...