【发布时间】:2015-06-02 15:18:06
【问题描述】:
从 WebForms 开始了解一些 MVC 的东西并不是很直观,我正在努力寻找一种从控制器弹出模式的方法(取决于回发结果)..
模态
<div id="PopupModal" class="modal fade in out">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" aria-hidden="true" type="button" data-dismiss="modal">×</button>
<h4 class="modal-title" id="ModalTitle"></h4>
</div>
<div class="modal-body" id="ModalBody">
<h5 id="ModalBodyText"></h5>
</div>
<div class="modal-footer">
<button class="btn btn-default" type="button" data-dismiss="modal">Close</button>
</div>
</div>
</div>
这就是我在 WebForms 中提出事件的方式
Private Sub ModalValidation(Message As String)
Try
Dim SB As New StringBuilder
SB.Append("$(document).ready(function(){")
SB.Append("$('#PopupModal').modal();")
SB.Append("var vBody = document.getElementById('ModalBodyText');")
SB.Append("vBody.innerHTML = '" & Message & "';")
SB.Append("var vTitle = document.getElementById('ModalTitle');")
SB.Append("vTitle.innerHTML = 'Validation';")
SB.Append("vTitle.style.color = 'orange';")
SB.Append("});")
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "ValidationShowModal", SB.ToString, True)
Catch ex As Exception
Dim vError As New SendError
vError.MailError(60, PageName, ex)
End Try
End Sub
如何从控制器引发相同的事件?
谢谢
编辑 = 非常感谢 Vitor Salgado 为我指明了正确的方向
将此添加到控制器 - 索引
Function Index() As ActionResult
Dim vPopup As New UploadFilesResult
If Not Session("PopupMessage") Is Nothing Then
vPopup.PopupMessage = Session("PopupMessage")
Else
vPopup.PopupMessage = "None"
End If
ViewData("UploadFilesResult") = vPopup
Return View("BlueImpMinView")
End Function
将此添加到控制器 - ActionResult(操作正常完成的地方)
Session("PopupMessage") = "The file was successfully uploaded!"
Return Redirect("/blueimp/Index#Completed")
在视图中添加了一个隐藏字段
@code
Dim vPopup As MVPTest.UploadFilesResult = CType(ViewData("UploadFilesResult"), MVPTest.UploadFilesResult)
Dim vPopupMessage As String = vPopup.PopupMessage
@Html.TextBox("MessageTB", vPopupMessage, New With {.type = "hidden"})
End Code
和模态的javascript
<script>
window.onload = function () {
var vType = location.hash;
var vMessage = document.getElementById('MessageTB').value;
switch (vType) {
case '#Completed':
//run code for completed modal
$(document).ready(function () {
$('#PopupModal').modal();
var vBody = document.getElementById('ModalBodyText');
vBody.innerHTML = vMessage;
var vTitle = document.getElementById('ModalTitle');
vTitle.innerHTML = 'Success';
vTitle.style.color = 'green';
});
break;
case '#Error':
//run code for error modal
break;
case '#Validation':
//run code for validation modal
}
}
</script>
【问题讨论】:
-
为什么要从控制器上提出来?你为什么要附加脚本?控制器应该以这种方式影响视图:它应该将任何必要的数据传递给视图,然后视图应该弄清楚如何显示自己(这可能涉及客户端代码)。确保您正确理解 MVC 架构以及 View 和 Controller 所扮演的角色以及它们应该如何交互。
-
嗨 Mason - 控制器是执行所有数据处理的地方。我知道 ScriptManager 是 WebForms 而不是 MVC 的一部分,我只是想找到一种在数据处理完成后提升 Modal 的方法(或视情况而定)。我不得不说我还不太了解架构,但我几天前才开始学习——我学习的唯一方法就是开始尝试……
-
我建议在您的控制器中进行验证,然后将模型(包括验证)传递给视图并让视图解决。
-
如果我理解正确,您将数据发布到控制器,然后当再次呈现视图时,您想要显示模式。对吗?
-
杰米——你能给我举个例子吗? - MarkPSmith - 正确
标签: asp.net asp.net-mvc twitter-bootstrap