2つのデータセットをビューに渡す方法
-
10-07-2019 - |
質問
2つのデータセットをASP.NET MVCのビューに渡す方法を教えてください
いくつかのことを試しましたが、どちらも機能しなかったので、単純な結論に達しました。間違っています。
2つのクエリがあります:
callRepository.FindOpenCalls()
および callRepository.FindAllMyCalls(user)
2つの部分ビュー(それぞれOpenCalls.ascxとAssignedCalls.ascx)を介して両方のデータセットを1つのビューに出力します。
CallsController.vbのIndex()関数を使用してこれを行いたいです。
現時点では次のとおりです。
'
' 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(&quot; MyOpenCallCount&quot;)
)の代わりに、このビューに必要なすべてのデータを含む特定のクラスを定義します(私の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)
から派生した強く型付けされたビューを使用します。これにより、インテリセンスが得られ、情報を取得するためにハードコードされた文字列と格闘する必要がなくなります。
すべての呼び出しと現在のユーザー呼び出しの両方からの情報をCallViewDataに入力し、このインスタンスを返します。
Dim data as new CallViewData
data.AllCalls = new CallInfo {OpenCallCount = ... }
'etc
return View(data)
他のヒント
データ項目をViewDataに個別に割り当てる必要はありません。何らかの理由でCallRepositoryオブジェクトを渡せない場合は、開いているすべてのコールリポジトリデータを保持する別のデータオブジェクトを作成して渡すことができます。
そして、それは長期的には実際により柔軟な設計です。
ViewDataをモデルオブジェクトに保存して渡すことができます。この PRO ASP.NET MVC 9章で非常によく説明されています。