我在vb.net中创建mvc应用程序,我正在尝试使用ViewModel来显示有关SQL中两个表的信息。
到目前为止,我可以成功显示一个表的信息,但我不确定如何显示另一个表中的信息。
当用户选择其ID时会显示IssueTable,但我想用它显示的表是CommentsTable。
IssueTable和CommentsTable之间存在一对多的关系,例如我想显示IssueSummary,并且对于每个与注释中的IssueID匹配的IssueID,我想显示commentBody,这将表示每个issueSummary会有多个评论。
到目前为止,这就是我所拥有的。
我创建了一个这样的类:
Namespace IssueTracker
Public Class IssueComments
Public cTable As CommentTable 'CommentTable in SQL database
Public iTable As IssueTable 'IssueTable in SQL database
End Class
End Namespace
然后在控制器中我得到了这个:
Dim IssTable As IssueTable = dbServer.IssueTables.Find(id) 'getting the ID of the selected issue
Dim iss As New IssueTable() With {
.IssueID = IssTable.IssueID,
.IssueKey = IssTable.IssueKey,
.IssueTypeID = IssTable.IssueTypeID,
.priorityID = IssTable.priorityID,
.IssueSummary = IssTable.IssueSummary,
.IssueDescription = IssTable.IssueDescription,
.Created = IssTable.Created,
.Updated = IssTable.Updated
} ' This will display the information about the specific issue crrectly
这里我试图显示有关评论的信息:
Dim comment As New CommentTable() With {
.CommentID = cTable.CommentID,
.CommentBody = cTable.CommentBody
} 'Will not display anything as it is not correctly connected with issueTable
Dim viewModelC As New IssueTracker.IssueComments() With {
.cTable = comment,
.iTable = iss
} 'Here I create the variable viewModel the return it in the view
Return View(viewModelC)
我正在尝试连接这两个表:
Dim viewModel = From c In dbServer.CommentTables Join i In dbServer.IssueTables On c.IssueID Equals i.IssueID Where (c.IssueID = i.IssueID)
Select New IssueTracker.IssueComments With {.cTable = c, .iTable = i}
如何正确显示commentsTable中与issueTable中的issueID相等的每个issueID的所有注释?
答案 0 :(得分:2)
如果您希望同时向视图发送所有问题+评论,请不要尝试将它们合并到控制器中,创建一个包含两个列表属性的新类(在ViewModels下)并发送它们视图和处理它。
Namespace IssueTracker.ViewModels
Public Class IssueCommentsViewModel
Public Issues As List(Of Issue)
Public Comments As List(Of Comment)
End Class
End Namespace
然后,在视图中,处理找到正确的数据,例如:
<table>
@For Each issue In Model.Issues
Dim comments = Model.Comments.Where(c=>c.IssueID == issue.IssueID))
@<tr>
<th>@issue.Summary</th>
<tr>
@For Each comment In comments
@<tr>
<td>@comment.CommentBody</td>
</tr>
Next
Next
<table>
(试图制作这个Razor vb.net语法 - 希望可以看到这个概念,而不是语法问题)
编辑:填充视图模型,从问题中获取现有代码:
Dim model = New ViewModel()
model.Issues = dbServer.IssueTables
model.Comments = dbServer.CommentTables
Return View(model)
重新查看代码,看起来您只返回一个问题,因此更新了:
Namespace IssueTracker.ViewModels
Public Class IssueCommentsViewModel
Public Issue As IssueTable
Public Comments As List(Of CommentTable)
End Class
End Namespace
Dim model = New ViewModel()
model.Issues = dbServer.IssueTables.Find(id)
model.Comments = dbServer.CommentTables.Where(x=>x.IssueID Equals id) ' this doesn't look like VB to me, so change accordingly
Return View(model)
<table>
<tr>
<th>@Model.Issue.Summary</th>
<tr>
@For Each comment In Model.Comments
@<tr>
<td>@comment.CommentBody</td>
</tr>
Next
<table>
暂且不说:如果您有很多问题+评论,那么您应该只查看视图中的问题,然后使用ajax回调根据用户操作动态加载评论(例如,点击&#39;展开&#39;图标)
答案 1 :(得分:1)
当用户点击某个项目时,您可以使用ajax调用,传递项目pk以查找第二个表格数据,并将结果放在页面上。
例如,你有2个div在页面上,1st显示了iss表,当用户点击表中的一个项目时,开始ajax调用另一个控制器/动作,传递项目pk,动作返回一个没有布局的视图,在查看,显示注释表。在第二个div中输出js的结果
有一种狡猾的方式,添加一个
@Ajax.ActionLink("comments","actionName","ControllerName",new{id=item.id},new AjaxOptions{UpdateTargetId="div2"})
在第一张桌子的每一行中。&#34; div2&#34;你是第二个人的身份吗 请务必在页面中引用jquery.unobtrusive-ajax.js。它将起作用 有2个控制器/动作1获取iss表数据并返回视图 第二个需要一个参数来重新获取iss表pk,并获得该表中的注释表数据 我很难阅读vb.net代码,希望这可以帮到你