【问题标题】:Open bootstrap Modal from link for each item in a list in view - MVC从视图中列表中每个项目的链接打开引导模式 - MVC
【发布时间】:2016-10-17 02:39:35
【问题描述】:

我有一个视图,它对数据库项目列表进行 for each 循环。我希望为每个打开一个模式的“详细信息”操作,将每个项目的 id 传递到其中,并在该模式内的部分视图中显示该项目的详细信息。

到目前为止,我有以下内容

@foreach (var item in Model)
{
  <a href="#detailsModal" role="button" class="btn" data-toggle="modal">Details</a>
}

 <div class="modal fade" id="detailsModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
                 <div class="modal-content">
                       <div class="modal-body">
@{Html.RenderAction("_PartialDetails", "ActivityAds", new { @id = "NEED TO PASS ID HERE" });}
                       </div>
              </div>
        </div>
   </div>

我试图避免将模式放在 for each 循环中,因为我担心必须为每条记录创建一个模式会非常低效。我也可能将 Modal 中的部分视图称为错误。我没有练习我害怕,我相信有办法做到这一点

谢谢

【问题讨论】:

  • 就像@Nikki9696 所说,您只需定义一次局部视图/模态并将其隐藏。点击详情后,可以在JS中抓取你需要的值,绑定到表单中,然后展示表单

标签: html asp.net-mvc razor bootstrap-modal partial-views


【解决方案1】:

一种方法是使用 ajax 动态填充容器。

这是我拥有的应用程序的示例 - 请注意,某些 javascript 位于外部 js 文件中,因此无法直接使用模型;为此目的,模型值存储在隐藏字段和/或 data-id、data-value 属性中

        @foreach (var assignment in Model.Assignments)
        {                
            <li role="presentation" id="assignmentsDetails_@assignment.AssignmentView.AssignmentViewId" data-id="@assignment.AssignmentView.AssignmentViewId">
                <a role="menuitem" onclick="selectCriteria(this);" title="@assignment.AssignmentView.AssignmentViewDescription">Criteria @criteriaNumber</a>
            </li>
            criteriaNumber++;
        }

javascript

function selectCriteria(clickedElement) {
    var dataid = $(clickedElement).parent().attr("data-id");
    loadAssignmentDetails(dataid);
}

function loadAssignmentDetails(assignmentViewId) {
    $.ajax({
        type: "GET",
        url: Config.RootUrl + "Assignments/Detail/" + assignmentViewId + "/" + $("#AssignmentTypeValueId").val(),
        success: function (data) {
            $("#assignmentViewDetailsContainer").html(data);
        }
    });
}

【讨论】:

  • 这适用于一些调整和更改。谢谢你的基础。如果他们需要,我将添加我用于其他人的代码:)
【解决方案2】:

这是我基于“Nikki9696”的解决方案的答案:) 它运行良好。非常感谢! Nikki9696

function showDetails(clickedElement) {
    var dataid = $(clickedElement).attr("data-id");
    showDetailsAjax(dataid);
}

function showDetailsAjax(activityAdID) {
    var link = '@Url.Action("_PartialDetails", "ActivityAds", new { id = "-1"})'
    link = link.replace("-1", activityAdID);

    $.ajax({
        type: "GET",
        url: link,
        error: function(data)
        {},
        success: function (data) {
            $("#detailsModal .modal-body").html(data);
            $('#detailsModal').modal('show');
        },
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>


<div class="modal fade" id="detailsModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-body"></div>
        </div>
    </div>
</div>

@foreach (var item in Model)
{
    <a onclick="showDetails(this);" id="activityAdDetails_@item.ad_id" data-id="@item.ad_id">Details</a>
}

【讨论】:

    【解决方案3】:

    我有一个替代方案,类似但足够不同,我认为值得分享 - 我想使用不显眼的 jquery 仅通过属性标记来实现相同的目标,所以我为模态和它的脚本定义了一个单独的局部视图,并将其包含在我的布局页面中,以便在每个其他视图中我需要做的就是添加标记以使用我在该部分脚本中构建的模式和功能。我向模态添加了功能,以允许我指定在模态提交成功时调用的脚本等。从服务器检索对话框内容(通过调用返回部分视图的控制器方法 - 因此需要禁用ajax缓存)。下面是一个列表之外的示例,它在完成时调用 javascript RefreshAll:

      <button class="btn btn-sm btn-success completeFixtureButton"
              data-submittext="Update" 
              data-modalsubmit="CompleteFixtureForm" 
              data-modaltitle="Fixture Completed"
              data-modalsuccess="RefreshAll();"
              data-modalload="@Url.Action("FixtureCompleted", new { fixtureId = fix.Id })">
    

    这是一个类似的示例,但来自一个按钮而不是按钮样式的链接:

      <a class="btn btn-default" href="#"
         data-modalsubmit="editLeagueForm"
         data-modaltitle="Edit Season"
         data-modalsize="lg"
         data-modalload="@Url.Action("EditLeaguePartial", "League", new { leagueId = Model.Season.League.Id, seasonId = Model.Season.Id })"><span class="glyphicon glyphicon-white glyphicon-cog"></span>Season Settings</a>
    

    这是列表/表格中的一个:

    <tbody id="clubList">
      @foreach (Player p in Model.Club.Players.OrderBy(p => p.LastName))
      {
        bool playerManager = Model.Club.Managers.Any(m => m.Id == p.Id);
        <tr>
          <td>
            <a href='#' data-modaltitle="@p.FullName" data-modalload="@Url.Action("ContactPlayerPartial", "Player", new { playerId = p.Id })">
              <img src="@Url.Action("ProfilePictureById", "Player", new { playerId = p.Id })" style="max-width:3em; margin-right:10px;" class="pull-left" />  @p.FullName
            </a>
          </td>
        </tr>
        ...
      }
    

    这是共享视图文件夹中的模态部分 (_ModalDialogPartial.cshtml):

    <div id="details" class="modal fade">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h2 id="detailsHeader"></h2>
                </div>
                <div class="modal-body">
                    <div id="detailsBody" ></div>
                </div>
                <div class="modal-footer">
                    <a href="#" id="btnModalCancel" class="btn" data-dismiss="modal">Close</a>
                    <input type="submit" id="btnModalSave" class="btn btn-primary" value="Save"/>
                </div>
            </div>
        </div>
    </div>
    
    <script type="text/javascript">
    
        $(document).ready(function () {
            $.ajaxSetup({ cache: false });
    
            initialiseModals();
        });
    
        function initialiseModals() {
    
          $('#details').on('shown.bs.modal', function () {
            $.validator.unobtrusive.parse($('#details'));
          });
    
            $(document).on('click', '*[data-modalload]', function () {
                var e = $(this);
    
                if (e.data('submittext') != undefined) {
                  $('#btnModalSave').html(e.data('submittext'));
                } else $('#btnModalSave').html('Save');
    
                if (e.data('class') != undefined) {
                    var cls = e.data('class');
                    $('#details').removeClass(cls).addClass(cls);
                }
                if(e.data('modalsize') != undefined) {
                  var size = e.data('modalsize');
                  $('.modal-dialog').addClass('modal-' + size);
                }
    
                if (e.data('modalsubmit') == undefined) {
                    $('#btnModalSave').hide();
                    $('#btnModalCancel').addClass("btn-primary");
                }
                else {
                    $('#btnModalSave').show();
                    $('#btnModalCancel').removeClass("btn-primary");
                    $('#btnModalSave').unbind('click').click(function (ctrl) {
                        $('#btnModalSave').attr('disabled', 'disabled');
    
                        ctrl.preventDefault();
                        var submitUrl = $('#' + e.data('modalsubmit')).attr("action");
    
                        var formData = $('#' + e.data('modalsubmit')).serialize();
                        $.post(submitUrl,
                            formData,
                            function (data, status, xhr) {
                                $('#btnModalSave').removeAttr('disabled');
                                $('#details').modal('hide');
                                if (e.data('modalsuccess') != undefined) {
                                    eval(e.data('modalsuccess'));
                                }
                            }).error(function () {
                              $('#btnModalSave').prop('disabled', false);
                            });
                    });
                }
    
                $('#detailsBody').load(e.data('modalload'), function () {
                    $('#detailsHeader').html(e.data('modaltitle'));
                    $('#details').modal('show');
                    $.validator.unobtrusive.parse($('#detailsBody'));
                });
            });
        }
    
    </script>
    

    【讨论】:

    • 非常感谢您的解决方案。我确实考虑了一个专门用于模态的局部视图,就像几年前我自己做的那样,我不记得我是如何成功地做到这一点的。我可能会尝试实现此方法作为替代方法,只是为了好玩并提醒自己。那就选择哪一个更有效、更易理解☺感谢分享
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多