Как передать два набора данных в представление? - PullRequest
0 голосов
/ 29 октября 2009

Как мне передать два набора данных в представление в ASP.NET MVC?

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

У меня 2 запроса:

callRepository.FindOpenCalls() и callRepository.FindAllMyCalls(user)

и я хочу поместить оба набора данных в одно представление с помощью двух частичных представлений (OpenCalls.ascx и AssignedCalls.ascx соответственно).

Я бы хотел сделать это, используя функцию Index () в моем CallsController.vb.

На данный момент у меня есть:

'
' GET: /Calls/

<Authorize()> _
Function Index() As ActionResult
    ViewData("OpenCallCount") = callRepository.CountOpenCalls.Count()
    ViewData("UrgentCallCount") = callRepository.CountUrgentCalls.Count()
    ViewData("HighCallCount") = callRepository.CountHighCalls.Count()
    ViewData("NormalCallCount") = callRepository.CountNormalCalls.Count()
    ViewData("LowCallCount") = callRepository.CountLowCalls.Count()

    ViewData("MyOpenCallsCount") = callRepository.CountMyOpenCalls(Session("LoggedInUser")).Count()
    ViewData("UserName") = Session("LoggedInUser")

    Dim viewOpenCalls = callRepository.FindAllOpenCalls()
    Dim viewMyOpenCalls = callRepository.FindAllMyCalls(Session("LoggedInUser"))

    Return View(viewOpenCalls)
End Function

Который, очевидно, возвращает только открытые вызовы, но я бы хотел вернуть и viewOpenCalls, и viewMyOpenCalls.

Как бы я поступил?

Показывает ли моя помощь по LINQ?

Спасибо за любую помощь заранее.

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

Лучший способ передать данные в представление - это иметь конкретные ViewData для вашего представления, содержащие только необходимые данные.

Вместо магических строк (ViewData("MyOpenCallCount")) определите определенный класс, содержащий все данные, необходимые для этого представления (извините, если мой VB.Net немного заржавел):

public class CallInfo
    public OpendCallCount as int
    public UrgentCallCount as int   
    'etc.
end class

public class CallViewData
    public AllCalls as CallInfo
    public MyCalls as CallInfo
    public UserName as String
end class

И используйте строго типизированное представление, полученное из ViewPage(of CallViewData), таким образом, у вас есть intellisense, и вам не нужно бороться с жестко закодированными строками, чтобы получить вашу информацию.

Вы заполняете CallViewData информацией обо всех вызовах и вызовах текущего пользователя, возвращайте этот экземпляр.

   Dim data as new CallViewData
   data.AllCalls = new CallInfo {OpenCallCount = ...  }
   'etc
   return View(data)
0 голосов
/ 29 октября 2009

Вы можете сохранить свои ViewData в объекте модели и передать его. Это очень хорошо объяснено в главе 9 ASP.NET MVC PRO *.

. *1003*
0 голосов
/ 29 октября 2009

Вам не нужно назначать элементы данных для ViewData по частям, как вы делаете. Если по какой-то причине вы не можете передать объекты (и) CallRepository, то вы можете создать и другой объект данных, который будет хранить ваши данные open и все вызовы хранилища и передавать их.

И это дизайн, который на самом деле намного более гибок в долгосрочной перспективе.

...