1

ユーザー、アカウント マネージャー、および管理者という 3 つのロールを持つ MVC プロジェクトがあります。

管理者には、ユーザーとアカウント マネージャーを完全に制御できる独自の MVC エリアがあります。管理者が任意のユーザーまたはアカウント マネージャーとしてサイトを表示できるようにする機能を実装しようとしています。

サイトの管理エリアには、ユーザーとアカウント マネージャーのリストのビューがあります。リストには、各レコードの [View Site As User] ボタンが含まれています。

これまでにこのようなことをしたことはありませんが、ViewAsコントローラー アクションは現在、次のように、選択したユーザーの情報を使用してセッションを作成するように設定されています。

ViewBag.SiteSession = Session["SiteSession"] = new SiteSession()
{
    ID = user.ID,
    AccountID = user.AccountID,
    DisplayName = user.DisplayName,
    IsManager = user.IsAdmin,
    IsAdmin = false
};

このアクションに関連するビューには、 として定義されたモデルがあり、次のようにモデルを属性stringとして持つ iframe 以外には何もありません。src

@model string
<iframe src="@Model" >

</iframe>

私がやろうとしているのは、この iframe で要求されたサイトの部分をレンダリングすることです。管理者が「ユーザーとして表示」をクリックすると、ホームに移動したい。URL は、次の呼び出しによって生成されます。

Url.Action("Index", "Home", new { Area = "" }));

管理エリアのホームのレンダリングを避けるために、エリアは何も設定されていません。

現在、これは機能していません。すでに持っているものを差し引いて、どこから始めればよいかさえわかりません。

提案を探しています。これは簡単な作業ではないように思われるため、すべてのヘルプが大歓迎です。

どうすればいいかわからない場合は、この質問をできる人に向けていただければ幸いです。

繰り返しますが、事前に感謝します。

4

2 に答える 2

2

私が過去にこれを行った方法は、実際のユーザーと効果的なユーザーの概念を使用することでした。ほとんどの表示アクションは、有効なユーザーを使用してコンテンツを生成します。通常、「プレビュー」ではなく「偽装」として実装したため、ユーザーは別のウィンドウに表示するのではなく、実際にユーザーとしてサイトをナビゲートしています。この場合、現在のセッションで両方を設定するだけです。管理者の許可が必要なもの (なりすましへの切り替えなど) は、明らかに実際のユーザーを使用します。

プレビューを行いたい場合は、各リクエストでパラメーターを使用して有効なユーザーを設定することを検討します。このパラメーターをすべてのリンクに追加するにiframeは、元のインターフェイスでナビゲーションを台無しにすることなくナビゲートできるように、コードを理解する必要があります。

URLから領域を削除することに関しては、あなたが持っているもの(空の文字列に設定)が機能すると思います。うまくいかない場合は、小文字areaの ,を試してくださいUrl.Action("Index", "Home", new { area = "" })。ただし、内部で作成される は大文字と小文字を区別しないキー比較を使用していると確信しているRouteValueDictionaryため、問題にはなりません。

于 2013-08-02T19:19:34.057 に答える
0

このタスクのために、別のコントローラー を作成することになりました。このコントローラーには、管理者ロールを持つユーザーのみがそのアクションにアクセスできるViewAsControllerコントローラー全体の属性がありました。[Authorize]

Startアクションでは、Session選択したユーザーの情報を含むオブジェクトが次のように作成されます。

[HttpGet]
public ActionResult Start(int id)
{
    var user = db.Users
        .First(u => u.ID == id);

    Session["SiteSession"] = new SiteSession()
    {
        //Session data...
    };

    return PartialView("_IFrame");
}

このアクションは、最終的に jQuery UI モーダル ダイアログ ウィンドウに表示した部分ビューを返します。

その部分ビューのコードは次のとおりです。

@{
    ViewBag.SiteSession = (SiteSession)Session["SiteSession"];
}
<h2>Viewing Site As @ViewBag.SiteSession.DisplayName</h2>
<div>
    <iframe src="@Url.Action("Index", "Home", new { Area = "" })"></iframe>
</div>

ご覧のとおり、非常に裸であり、まさにそれが必要です。は<iframe>ブラウザ内のブラウザとして機能し、管理者ユーザは、選択したユーザが実行するアクションにフル アクセスできます。

詳細を説明するために、ダイアログを作成して開く jQuery を次に示します。

$(function () {
    $("#viewAsDialog").dialog({
        modal: true,
        autoOpen: false,
        resizable: true,
        draggable: true,
        closeOnEscape: false,
        height: $(window).height() * .9,
        width: 1000,
        closeText: '',
        close: function () {
            $.post("@Url.Action("End", "ViewAs", new { Area = "Admin" })")
                    .success(function (result) {
                    });
        }
    });
});

function viewAs(result) {
    $("#viewAsDialog").html(result);
    $("#viewAsDialog").dialog("open");
}

ここで、ダイアログがドキュメント対応で初期化され、部分ビューを取得する AJAX 呼び出しが正常に完了するまで開かれないことがわかります。

管理者がダイアログを閉じると、サーバーはコントローラーでEndアクションを呼び出しViewAs、セッションを破棄します。

[HttpPost]
public ActionResult End()
{
    Session["SiteSession"] = null;

    return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);
}
于 2013-08-05T17:58:22.263 に答える