当用户选择特定ID时,在详细信息视图中显示来自两个表的信息

时间:2015-07-24 08:17:17

标签: asp.net-mvc vb.net

我在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的所有注释?

2 个答案:

答案 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代码,希望这可以帮到你