使用 Bootstrap 模态窗口作为 PartialView

IT技术 javascript asp.net-mvc twitter-bootstrap modal-dialog
2021-02-26 04:25:31

我希望使用Twitter Bootstrap Modal 窗口作为局部视图。但是,我真的不认为它是为以这种方式使用而设计的。似乎它旨在以相当静态的方式使用。尽管如此,我认为能够将它用作局部视图会很酷。

例如,假设我有一个游戏列表。单击给定游戏的链接后,我想从服务器请求数据,然后在当前页面“顶部”的模式窗口中显示有关该游戏的信息。

我做了一些研究,发现这篇文章很相似,但并不完全相同。

有没有人尝试过这个成功或失败?任何人都有关于 jsFiddle 的东西或他们愿意分享的一些来源?

谢谢你的帮助。

6个回答

是的,我们已经这样做了。

在您的 Index.cshtml 中,您将拥有类似..

<div id='gameModal' class='modal hide fade in' data-url='@Url.Action("GetGameListing")'>
   <div id='gameContainer'>
   </div>
</div>

<button id='showGame'>Show Game Listing</button>

然后在同一页面的 JS 中(内联或在一个单独的文件中,你会有这样的东西..

$(document).ready(function() {
   $('#showGame').click(function() {
        var url = $('#gameModal').data('url');

        $.get(url, function(data) {
            $('#gameContainer').html(data);

            $('#gameModal').modal('show');
        });
   });
});

使用控制器上的方法,看起来像这样..

[HttpGet]
public ActionResult GetGameListing()
{
   var model = // do whatever you need to get your model
   return PartialView(model);
}

您当然需要在您的 Views 文件夹内有一个名为 GetGameListing.cshtml 的视图。

如果您想从模态提交表单,它会变得更加复杂。
2021-04-21 04:25:31
是的,我目前在我的应用程序中使用它。我可能会以这种方式对错误采用相同的格式。
2021-04-22 04:25:31
顺便说一句:如果您的模式不起作用,请在此处检查您的 Bootstrap 版本和最新示例代码:getbootstrap.com/javascript/#modals我现在尝试了此代码并且效果很好!:)
2021-04-28 04:25:31
最重要的是您需要处理服务器端错误。当需要显示错误时,我们通过让服务器返回一个带有结果代码的 json 对象和部分视图(填充有模型错误)作为字符串来做到这一点。
2021-05-03 04:25:31
在我从 gameModal div 类中删除“隐藏”之前,这对我不起作用。
2021-05-14 04:25:31

我使用mustache.js和模板(你可以使用任何 JavaScript 模板库)来做到这一点

在我看来,我有这样的事情:

<script type="text/x-mustache-template" id="modalTemplate">
    <%Html.RenderPartial("Modal");%>
</script>

...这让我可以将我的模板保存在名为 的部分视图中Modal.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <div>
        <div class="modal-header">
            <a class="close" data-dismiss="modal">&times;</a>
            <h3>{{Name}}</h3>
        </div>
        <div class="modal-body">
            <table class="table table-striped table-condensed">
                <tbody>
                    <tr><td>ID</td><td>{{Id}}</td></tr>
                    <tr><td>Name</td><td>{{Name}}</td></tr>
                </tbody>
            </table>
        </div>
        <div class="modal-footer">
            <a class="btn" data-dismiss="modal">Close</a>
        </div>
    </div>

我在我的视图中为每个模态创建占位符:

<%foreach (var item in Model) {%>
    <div data-id="<%=Html.Encode(item.Id)%>"
         id="modelModal<%=Html.Encode(item.Id)%>" 
         class="modal hide fade">
    </div>
<%}%>

...并使用 jQuery 进行 ajax 调用:

<script type="text/javascript">
    var modalTemplate = $("#modalTemplate").html()
    $(".modal[data-id]").each(function() {
        var $this = $(this)
        var id = $this.attr("data-id")
        $this.on("show", function() {
            if ($this.html()) return
            $.ajax({
                type: "POST",
                url: "<%=Url.Action("SomeAction")%>",
                data: { id: id },
                success: function(data) {
                    $this.append(Mustache.to_html(modalTemplate, data))
                }
            })
        })
    })
</script>

然后,您只需要在某处触发:

<%foreach (var item in Model) {%>
    <a data-toggle="modal" href="#modelModal<%=Html.Encode(item.Id)%>">
        <%=Html.Encode(item.DutModel.Name)%>
    </a>
<%}%>

我通过使用我在这里找到的一个很好的例子来实现这一点我已经用 Twitter Bootstrap Modal 窗口替换了该示例中使用的 jquery 对话框。

Flavia Obreja 和@Shane Courtrille,你能在这里用一个没有任何插件的例子来解释“从模态提交表单”吗?
2021-05-06 04:25:31

完整清晰的示例项目 http://www.codeproject.com/Articles/786085/ASP-NET-MVC-List-Editor-with-Bootstrap-Modals 使用引导程序显示创建、编辑和删除实体操作模态,还包括代码处理从这些实体操作返回的结果(c#、JSON、javascript)

我使用 AJAX 来做到这一点。您对典型的 twitter 模态模板 html 有自己的看法:

<div class="container">
  <!-- Modal -->
  <div class="modal fade" id="LocationNumberModal" role="dialog">
    <div class="modal-dialog">
      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">
            &times;
          </button>
          <h4 class="modal-title">
            Serial Numbers
          </h4>
        </div>
        <div class="modal-body">
          <span id="test"></span>
          <p>Some text in the modal.</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
          </button>
        </div>
      </div>
    </div>
  </div>
</div>

然后你有你的控制器方法,我使用 JSON 并有一个自定义类,它将视图呈现为字符串。我这样做是为了我可以通过一个 ajax 调用在屏幕上执行多个 ajax 更新。此处参考:示例,但如果您只是进行一次调用,则可以在返回时使用 PartialViewResult/ActionResult。我将使用 JSON 显示它..

和控制器中的 JSON 方法:

public JsonResult LocationNumberModal(string partNumber = "")
{
  //Business Layer/DAL to get information
  return Json(new {
      LocationModal = ViewUtility.RenderRazorViewToString(this.ControllerContext, "LocationNumberModal.cshtml", new SomeModelObject())
    },
    JsonRequestBehavior.AllowGet
  );
}

然后,在使用您的模式的视图中:您可以将 AJAX 打包在您的部分中并调用 @{Html.RenderPartial... 或者您可以使用带有 div 的占位符:

<div id="LocationNumberModalContainer"></div>

然后你的ajax:

function LocationNumberModal() {
  var partNumber = "1234";

  var src = '@Url.Action("LocationNumberModal", "Home", new { area = "Part" })'
    + '?partNumber='' + partNumber; 

  $.ajax({
    type: "GET",
    url: src,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function (data) {
      $("#LocationNumberModalContainer").html(data.LocationModal);
      $('#LocationNumberModal').modal('show');
    }
  });
};

然后按钮到您的模态:

<button type="button" id="GetLocBtn" class="btn btn-default" onclick="LocationNumberModal()">Get</button>