0

管理者がユーザー名を入力してユーザーになりすますことができる管理機能を自分のサイトに実装しようとしています (表示内容を確認するため)。

これはすべてのページにあるため、現在、_Layoutマスタービューの_LogOn部分ビューでjQueryUiダイアログとしてこの設定をしています。ただし、これまで対処したことのない問題がいくつかあるため、この時点で何をすべきかわかりません。

1)入力されたユーザー名が存在するかどうかを確認するためにチェックを実行する必要があります。存在しない場合は、ダイアログのフォームにメッセージを表示する必要があります。

2)送信後、ページ全体をリロードする必要があります(したがって、新しいユーザーの更新により表示される内容が変更されます)。

3) ページがリロードされると、ボックスが再び開いて表示されます。ダイアログフォームが送信された後。

したがって、パーシャルにはコントローラーがないため、これを実装する方法がわかりません。また、送信がその特定のフォームからのものであるかどうかに基づいてjqueryボックスを再表示する方法も、パーシャルがそうでないときにエラーメッセージを表示する方法もわかりません。 t はモデルに基づいています。次に、フォームを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>

誰かがこれを行う方法を教えてもらえますか? ありがとう。

4

2 に答える 2

0

誰かになりすますときに現在のユーザーIDを置き換えることができるカスタムIIdentityを実装することをお勧めします。User.Current.Nameが呼び出された場合は通常のユーザーを返し、User.Current.Nameが使用された場合は偽装されたユーザーを返します。

これは前面でもう少し作業が必要ですが、どのページでも心配する必要はありません。通常どおりに機能します。さらに、メインアプリでロジックを変更する必要はありません。

于 2012-05-10T21:20:50.773 に答える
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 がプロップされます。

お役に立てれば。

于 2012-05-10T16:48:41.347 に答える