You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Asp.NET MVC中点击详情按钮如何获取Patient.Id并显示关联详情

解决ASP.NET MVC中点击详情按钮展示关联医生信息的问题

嘿,我明白你现在的困扰:在遍历患者列表时,点击每个患者的Detail按钮,想显示和这个患者ID关联的医生详情,但不知道怎么传递当前患者的ID,也不确定要不要用局部视图对吧?我给你两个实用的方案,你可以根据场景选:

先看你现有代码的问题点

你现在的代码里,在</tbody>后的div里直接用patient.Id是不行的——因为遍历患者的foreach循环已经结束了,patient变量在这里已经不存在了,必须通过点击事件把当前行的患者ID传递出去才行。


方案1:用Ajax+局部视图(推荐,代码更整洁易维护)

这个方法适合详情内容复杂或者需要复用的场景,完全符合MVC的设计思路:

1. 修改详情按钮,传递患者ID

把原来的详情按钮的onclick事件改成带参数的,把当前患者的ID传进去:

<a onclick="showDetails(@patient.Id)" class="btn btn-info"><i class="glyphicon glyphicon-list"></i> Detail</a>

2. 创建局部视图专门展示医生详情

在Views文件夹下(比如和主视图同目录)新建一个局部视图_DoctorDetails.cshtml,用来单独渲染医生的信息:

@model YourProject.Models.Doctor <!-- 替换成你实际的Doctor模型命名空间 -->

<div class="col-9 detailPatient" style="color:black; padding:15px;">
    @if (Model != null)
    {
        <div class="card">
            <div class="card-body">
                <h5 class="card-title">关联医生信息</h5>
                <table class="table table-sm">
                    <tr>
                        <td>FirstName:</td>
                        <td>@Html.DisplayFor(m => m.FirstName)</td>
                    </tr>
                    <tr>
                        <td>LastName:</td>
                        <td>@Html.DisplayFor(m => m.LastName)</td>
                    </tr>
                    <tr>
                        <td>从业年限:</td>
                        <td>@Html.DisplayFor(m => m.GodineIskustva)</td>
                    </tr>
                </table>
            </div>
        </div>
    }
    else
    {
        <p>该患者暂无关联医生信息</p>
    }
</div>

3. 在控制器里添加返回局部视图的Action

在你的患者控制器里,新增一个Action,用来根据患者ID查询对应的医生并返回局部视图:

public ActionResult GetDoctorDetails(int patientId)
{
    // 这里替换成你实际的数据库查询逻辑,比如从DbContext里找关联的医生
    var associatedDoctor = _context.Doctors.FirstOrDefault(d => d.Id == patientId);
    return PartialView("_DoctorDetails", associatedDoctor);
}

4. 编写JavaScript的showDetails函数

在主视图的底部(或者单独的js文件里)添加这个函数,通过Ajax请求获取医生详情并渲染到页面:

function showDetails(patientId) {
    // 发送Ajax请求到控制器的GetDoctorDetails方法
    $.ajax({
        url: '@Url.Action("GetDoctorDetails", "YourControllerName")', // 替换成你的控制器名称
        type: 'GET',
        data: { patientId: patientId },
        success: function (response) {
            // 把返回的局部视图内容放到指定容器里,先给你的详情容器加个id
            $('#doctorDetailsContainer').html(response);
        },
        error: function () {
            alert('加载医生详情失败,请稍后重试');
        }
    });
}

5. 调整主视图的详情容器

把原来的div加上id,方便我们定位渲染:

<div id="doctorDetailsContainer" class="col-9 detailPatient" style="color:black;">
    <!-- 初始可以放提示文字 -->
    <p>点击患者的Detail按钮查看关联医生信息</p>
</div>

方案2:提前渲染所有详情,点击时显示(适合简单场景)

如果你的详情内容很简单,不想用Ajax和局部视图,也可以提前把每个患者的医生详情渲染好,默认隐藏,点击时显示对应的块:

1. 修改患者列表的循环,添加隐藏的详情行

在遍历患者的foreach循环里,直接渲染对应的医生详情,用ID标记并隐藏:

<tbody>
@foreach (var patient in Model.Patients) {
    // 先获取当前患者关联的医生
    var associatedDoctor = Model.Doctors.FirstOrDefault(d => d.Id == patient.Id);
<tr>
<td>@Html.DisplayFor(modelItem => patient.FirstName)</td>
<td>@Html.DisplayFor(modelItem => patient.LastName)</td>
<td>@Html.DisplayFor(modelItem => patient.PersonalID)</td>
<td>
<a asp-action="Edit" asp-route-id="@patient.Id" class="btn btn-success"><i class="glyphicon glyphicon-pencil"></i> Edit</a>
<a onclick="showDetails(@patient.Id)" class="btn btn-info"><i class="glyphicon glyphicon-list"></i> Detail</a>
<form asp-action="DeleteUser" asp-route-id="@patient.Id" method="post" style="display: inline;">
<button class="btn btn-danger"> Delete </button>
</form>
</td>
</tr>
<!-- 隐藏的详情行,用patientId作为标识 -->
<tr id="patient-details-@patient.Id" style="display: none;">
    <td colspan="4">
        <div class="col-9 detailPatient" style="color:black; padding:15px;">
            @if (associatedDoctor != null)
            {
                <table class="table table-sm">
                    <tr>
                        <td>@Html.DisplayFor(m => associatedDoctor.FirstName)</td>
                        <td>@Html.DisplayFor(m => associatedDoctor.LastName)</td>
                        <td>@Html.DisplayFor(m => associatedDoctor.GodineIskustva)</td>
                    </tr>
                </table>
            }
            else
            {
                <p>无关联医生信息</p>
            }
        </div>
    </td>
</tr>
}
</tbody>

2. 编写showDetails函数

这个函数的作用是切换详情行的显示状态:

function showDetails(patientId) {
    // 先隐藏所有的详情行
    $('tr[id^="patient-details-"]').hide();
    // 显示当前点击的患者对应的详情行
    $('#patient-details-' + patientId).show();
}

关于是否需要局部视图?

  • 如果你的医生详情需要在多个页面复用,或者内容比较复杂(比如有样式、逻辑),一定要用局部视图,这样代码更易维护,也符合MVC的关注点分离原则。
  • 如果只是简单的几行文本展示,用方案2的方式也可以,但代码耦合度会高一些,后续修改起来不如局部视图方便。

内容的提问来源于stack exchange,提问作者JohnC

火山引擎 最新活动