【问题标题】:MVC 3: Change User jQueryUi dialog on _Layout view, how to handle?MVC 3:在_Layout视图上更改用户jQueryUi对话框,如何处理?
【发布时间】:2012-05-11 05:20:50
【问题描述】:

我正在尝试在我的网站上实现一个管理员功能,该功能允许管理员通过输入用户名来模拟用户(以查看他们看到的内容)。

现在我在 _Layout 主视图的 _LogOn 部分视图中将此设置作为 jQueryUi 对话框,因为这将在每个页面上。但是,由于一些我以前从未处理过的问题,我现在不知道该怎么做。

1) 我需要检查输入的用户名是否存在,如果不存在,它应该在对话框的表单中显示一条消息。

2) 我需要在提交后重新加载整个页面(因此显示的内容会因新用户更新而改变)。

3) 页面重新加载后,该框应再次打开。对话框表单提交后。

所以我不知道如何实现这一点,因为 partials 没有控制器,我也不知道如何根据提交是否来自该特定表单来重新出现 jquery 框,也不知道如何在partial 不基于模型。然后我考虑制作表单 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>

谁能告诉我怎么做?谢谢。

【问题讨论】:

    标签: ajax asp.net-mvc jquery-ui jquery-ui-dialog


    【解决方案1】:

    我建议使用 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。

    希望这会有所帮助。

    【讨论】:

    • 这就是我的想法,但这是我在 MVC 中从未做过的事情,而且对 AJAX 不是很熟悉,更不用说让它与 MVC 交互了,希望有一些代码示例寻求帮助。
    • 添加了一些示例来帮助您入门。祝你好运!
    【解决方案2】:

    我建议实现一个自定义 IIdentity,当您想冒充某人时,它可以替换当前的用户 ID。调用 User.Current.Name 时返回普通用户,使用 User.Current.Name 时返回模拟用户。

    这在前端需要做更多的工作,但是您在任何页面中都不必担心它......它就像正常工作一样。此外,您无需更改主应用程序中的任何逻辑。

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2013-05-19
      相关资源
      最近更新 更多