2015-06-02 25 views
1

來自WebForms讓我的頭部繞過一些MVC的東西不太直觀,我正在努力尋找一種從控制器彈出的方式(取決於回髮結果)。 。MVC 5 - 從控制器中提升Bootstrap Modal

模態

<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 

我怎樣才能提高從控制器相同事件的事件?

感謝

編輯=非常感謝維托爾·薩爾加多指着我在正確的方向

將此添加到控制器 - 指數

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 

和模態

<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> 
+0

爲什麼從控制器中提出它?你爲什麼要追加腳本?控制器應該以這種方式影響視圖:它應該將任何必要的數據傳遞給視圖,然後視圖應該弄清楚如何顯示自身(可能涉及客戶端代碼)。確保正確理解MVC體系結構以及View和Controller的角色以及它們應該如何交互。 – mason

+0

嗨梅森 - 控制器是進行所有數據處理的地方。我知道ScriptManager是WebForms的一部分,而不是MVC的一部分,我只是想在數據處理完成後(或者並非如此)找到一種提升Modal的方法。我不得不說我還沒有很好地理解這個架構,但是我前幾天才跳過 - 我學到的唯一方法就是跳進去嘗試一些東西...... – gchq

+0

我會建議你在然後控制器將模型(包括驗證)傳遞給視圖並讓視圖解決問題。 –

回答

4

在控制器代碼的JavaScript,你可以添加到您的查詢字符串的一些標誌參數或者返回一個特定的cookie,那麼,在你的JavaScript代碼,您可以識別這些標記值之一併顯示模態窗口。

這裏的一些示例代碼..

控制器

public ActionResult Register() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    return Redirect("/Home/Register#registered"); 
} 

視圖

@using (Html.BeginForm()) 
{ 
    <label>Login</label><br /> 
    @Html.TextBoxFor(x => x.Login) 

    <br /> 

    <label>Name</label><br /> 
    @Html.TextBoxFor(x => x.Name) 

    <br /> 

    <label>Email</label><br /> 
    @Html.TextBoxFor(x => x.Emai) 

    <br /> 

    <input type="submit" value="Register" /> 
} 

<script type="text/javascript"> 

    window.onload = function() { 
     if (window.location.hash == '#registered') { 
      alert('Your modal code here!'); 
     } 
    }; 

</script> 

動作寄存器(POST)是服務器端的代碼,將創建一些標記你客戶端代碼。在示例中,爲網址添加了散列值。您可以返回一個或更好的cookie值,向隱藏字段添加一些值並從中讀取值。在視圖中,有一個簡單的JS代碼在頁面加載時執行。 JS搜索哈希值並顯示模式。

+0

Vitor - 你能展示一個你的意思嗎?我當然可以給一個隱藏的文本框或者使用會話變量返回一個值,但是從代碼隱藏中完成所有事情我不知道如何在視圖中捕獲頁面加載事件(或者即使這樣做可以完成) – gchq

+0

我編輯了我的答案並添加了一些示例代碼。 –

+0

看起來像答案:-)午餐後嘗試,然後標記爲這樣。謝謝 – gchq

0

有幾種方法可以滿足MVC的處理方式。這是我會做的...

如果你需要服務器來決定是否顯示模式,但你不想刷新頁面,那麼AJAX可能是你想要的。使用可以使用jQuery的ajax調用將數據發佈到控制器動作,在服務器上做出決定,然後發回一個結果,您的js可以使用該結果來顯示模式或不顯示模式。這樣,頁面不需要刷新,但是您可以往返服務器以確定您需要執行的操作。