2012-05-10 33 views
0

我想在我的網站上實現一個管理員功能,允許管理員通過輸入用戶名來模擬用戶(看他們看到了什麼)。MVC 3:在_Layout視圖中更改用戶jQueryUi對話框,如何處理?

現在我有這個設置的,因爲這在_layout主視圖_LogOn局部視圖jQueryUI的對話框將在每個頁面上。但是,由於我以前從未處理過一些問題,因此我不確定此時該怎麼做。

1)我需要運行一個檢查,看看如果輸入的用戶名是否存在,如果它不應該顯示在對話框的形式的消息。

2)我需要在提交後重新加載整個頁面(那麼什麼是正在顯示的變化,由於新的用戶更新)。

3)在頁面重新加載後,該框應該再次顯示爲打開狀態。提交對話框表單之後。

所以我不知道如何實現這一點,因爲partials沒有控制器,我也不知道如何使jquery框重新出現的基礎上,如果提交來自該特定的形式,也不知道如何獲得錯誤消息時部分不是基於模型。然後我考慮製作AJAX表單,但我不知道該怎麼做,因爲整個頁面最終都必須重新加載才能更新顯示。

的除了_LogOn除了默認的代碼部分:

if (SessionUtil.IsSiteAdmin) 
{ 
    <button id="impersonate" style="position: relative; right: 20px; float: left; top: -30px;">Impersonate</button> 
    <div id="impersonate-user" title="Admin User Impersonation"> 
     @using (Html.BeginForm()) 
     { 
      <p>Currently Impersonating: 
       @if (SessionUtil.User.Id != SessionUtil.UserAbsolute.Id) 
       { 
        <text> 
        @SessionUtil.User.FirstName @SessionUtil.User.LastName (@SessionUtil.User.NetId) 
        </text> 
       } 
       else 
       { 
        <text>None</text> 
       } 
      </p> 
      <p>@Html.ActionLink("Stop Impersonating", "StopImpersonating", "Shared", new { area = "", @class = "ui-button ui-widget ui-state-default ui-corner-all" })</p> 
      <div> 
       <div id="ValidationSummary"> 
       @Html.ValidationSummary(true) 
       </div> 
       <fieldset> 
        <div class="editor-label"> 
         @Html.Label("Username to Impersonate") 
        </div> 
        <div class="editor-field"> 
         @Html.TextBox("Username") 
        </div> 

        <p> 
         <input type="submit" value="Impersonate"/> 
        </p> 
       </fieldset> 
      </div> 
     } 
    </div> 
} 

的JS:

<script type="text/javascript"> 
     $("#impersonate-user").dialog({ 
      autoOpen: false, 
      modal: false, 
      width: 400, 
      height: 505, 
      closeOnEscape: true, 
      resizable: false, 
      draggable: true 
     }); 
     $("#impersonate") 
      .button() 
      .click(function() { 
       $("#impersonate-user").dialog("open"); 
       $('.ui-dialog :button, .ui-dialog a').blur(); 
      }); 
    </script> 

有人能告訴我如何做到這一點?謝謝。

回答

0

我會建議使用ajax做名稱查找,並顯示錯誤消息,如果它沒有找到。無需重新加載失敗頁面。

它看起來像你使用jQuery,所以#1和#2:

$.ajax({ 
    url: actionUrl, 
    data: { username: username }, 
    success: function() { 
     window.location = window.location // I think this will refresh the page 
    }, 
    error: function(error) { 
     alert('username not found'); // do what you have to do 
    } 
}); 

我會爲你的情況做的是有你上述AJAX調用一個動作。如果用戶名存在,它設置一些標誌在會議上,如:Session["IsImpersonating"] = true,然後你可以在你的網頁塊,檢查了會議,並再次顯示對話框:

@if ((bool)Session["IsImpersonating"]) // null check omitted 
{ 
    <script> 
      $(function() { 
       $("#myDialog").dialog(); 
      }); 
    </script> 
} 

僅供參考,與執行的操作部分,我認爲你必須要做到以下幾點:

@Html.Action("MyAction", "MyController") 

這將使回調到服務器,就像如果你沒有一個正常的網頁加載,和放下它返回到任何視圖中的HTML這一頁。

希望這會有所幫助。

+0

這就是我在想什麼,但這是我從來沒有在MVC中做過的事情,並且我不太熟悉AJAX,更別說與MVC交互了,希望得到一些代碼示例以獲得幫助。 – SventoryMang

+0

增加了一些例子,讓你開始。祝你好運! – IronicMuffin

0

我建議實現自定義的IIdentity,當你想模仿別人,可替換的當前用戶ID。它會在調用User.Current.Name時返回普通用戶,或者在使用User.Current.Name時爲模擬用戶。

這是在正面更多的工作,但你永遠不必擔心它在任何網頁上..它只是作品像正常。此外,您不必在主應用程序中更改任何邏輯。

相關問題