Использование окна Bootstrap Modal как PartialView
Я искал использование Twitter Bootstrap Modal windows как частичное представление. Тем не менее, я действительно не думаю, что он был предназначен для использования таким образом; похоже, что он должен был использоваться довольно статически. Тем не менее, я думаю, было бы здорово использовать его как частичный вид.
Так, например, скажем, у меня есть список Игр. Нажимая на ссылку для данной игры, я хотел бы запросить данные с сервера, а затем отобразить информацию об этой игре в модальном окне "поверх" текущей страницы.
Я провел немного исследований и нашел этот пост, который похож, но не совсем то же самое.
Кто-нибудь пробовал это с успехом или неудачей? У кого-нибудь есть что-то на jsFiddle или на каком-то источнике, с которым они хотели бы поделиться?
Спасибо за вашу помощь.
Ответы
Ответ 1
Да, мы это сделали.
В вашем 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);
}
Конечно, вам понадобится представление под названием GetGameListing.cshtml внутри вашей папки Views.
Ответ 2
Я делаю это с помощью 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">×</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>
<%}%>
... и сделать ajax-вызовы с помощью jQuery:
<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>
<%}%>
Ответ 3
Я достиг этого, используя один хороший пример, который я нашел здесь.
Я заменил диалоговое окно jquery, используемое в этом примере, с окнами Twitter Bootstrap Modal.
Ответ 4
Полный и понятный пример проекта
http://www.codeproject.com/Articles/786085/ASP-NET-MVC-List-Editor-with-Bootstrap-Modals
Он отображает создание, редактирование и удаление модальных функций сущности с помощью начальной загрузки, а также код для обработки результата, возвращаемого из этих операций с сущностями (С#, JSON, javascript).
Ответ 5
Я использую 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">
×
</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>
Ответ 6
Поместите модальный и javascript в частичное представление. Затем вызовите частичное представление на вашей странице.
Это также обработает отправку формы.
Частичный вид
<div id="confirmDialog" class="modal fade" data-backdrop="false">
<div class="modal-dialog" data-backdrop="false">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Missing Service Order</h4>
</div>
<div class="modal-body">
<p>You have not entered a Service Order. Do you want to continue?</p>
</div>
<div class="modal-footer">
<input id="btnSubmit" type="submit" class="btn btn-primary"
value="Submit" href="javascript:"
onClick="document.getElementById('Coordinate').submit()" />
<button type="button" class="btn btn-default" data-
dismiss="modal">Cancel</button>
</div>
</div>
</div>
</div>
Javascript
<script type="text/javascript" language="javascript">
$(document).ready(function () {
$("#Coordinate").on('submit',
function (e) {
if ($("#ServiceOrder").val() == '') {
e.preventDefault();
$('#confirmDialog').modal('show');
}
});
});
</script>
Тогда просто позвоните своему частичку внутри формы вашей страницы.
Create.cshtml
@using (Html.BeginForm("Edit","Home",FormMethod.Post, new {id ="Coordinate"}))
{
//Form Code
@Html.Partial("ConfirmDialog")
}