Вопрос

Как мне передать два набора данных в представление в 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?

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

Это было полезно?

Решение

Лучший способ передать данные в представление - это иметь конкретные 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 (из CallViewData) , таким образом, у вас есть intellisense, и вам не нужно бороться с жестко закодированными строками, чтобы получить вашу информацию.

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

   Dim data as new CallViewData
   data.AllCalls = new CallInfo {OpenCallCount = ...  }
   'etc
   return View(data)

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top