【问题标题】:Avoid partial view to refresh in full screen避免局部视图全屏刷新
【发布时间】:2023-03-22 02:16:01
【问题描述】:

想象以下带有局部视图的架构。

有时,当我们的应用程序由于此处未解释的原因而发生错误时,局部视图会全屏刷新。 此外,如果您复制/粘贴部分视图的 url,它将以全屏方式加载。

我们正在尝试找到一种解决方案,在该解决方案中,当加载部分视图 url 时,它将正确加载完整上下文并在他自己的上下文中显示部分视图。 Windows Azure 设法做到了这一点 (http://manage.windowsazure.com),我们愿意模仿这个功能。

我们尝试在互联网上使用“在正确的上下文中刷新部分视图”、“在全屏中刷新部分视图的问题”等关键字进行一些搜索......但我们还没有找到正确实现这一目标的方法。

是否有任何框架或解决方案可以做到这一点?您对此有何想法?

【问题讨论】:

  • 您目前如何刷新局部视图;通过 AJAX 请求?
  • $('.menuLink').click(function () { $('#configurationpanel').load(this.href); return false; }

标签: jquery asp.net-mvc asp.net-mvc-4 partial-views partial-page-refresh


【解决方案1】:

如果你使用的是Partial Views,它明显涉及到ajax,你要做的就是通过ajax来做部分视图的事情。

例如:

如果您在部分内部有表单,则需要 Ajax.BeginForm 而不是 Html.BeginForm 并且另一件事是 jquery.unobtrusive-ajax 在您的主布局中添加文件以使事情正常进行。

如果您使用局部视图,您必须通过 ajax 处理其他事情也是如此,这样您就不会丢失上下文。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果您想避免完全刷新,则必须使用 ajax 并替换 id 中的内容。如果您打算这样做,这应该是一件容易的事。

    例如,您应该只需要将部分视图 url 传递给 jQuery.get。 jQuery.get

    我希望这就是你要找的。​​p>

    【讨论】:

    • 嗨 Andreas 和 @ehsan,请参阅上面针对 ashwini 的评论
    • ashwini 描述的就是我所说的。您是否可能在局部视图中声明了布局?他输入的内容应该正是您想要发生的事情。
    • 我会试试的。但是假设我有一个主页 (myapp/main) 和一个部分视图 myapp/home/GetPartialview。如果我在导航器中键入myapp/home/GetPartialview,我在@Ashwini 提供的示例中看不到任何代码,它会发现它必须首先加载容器页面(myapp/main),加载后会调用myapp/home/GetPartialview跨度>
    • 好吧,现在这听起来和我想的有很大不同。您的问题是它没有为局部视图加载容器页面?我认为您的问题是它确实重新加载了容器页面和部分视图,而不仅仅是部分视图?
    • 是的,您现在已经很好地理解了这个问题。这意味着我们必须在某个地方“存储”主容器的 url,如果我们不是来自这个 url,它应该被加载。在多种情况下实现工作非常复杂,为什么我要问是否有是一个现有的框架库,可以做到这一点。
    【解决方案3】:

    部分视图旨在用于可在整个网站的许多地方使用的可重复使用的视图。

    如果我们通过 ajax 加载它,我发现这非常有用。

    以下是示例。这也可以避免全屏刷新

    _Layout.cshtml(或任何会加载部分页面的视图页面)

    <div>
        <h2>This is Partial View content</h2>
        <div id="content"></div>
    </div>
    
    <script>
        $(function () {
            $("#content").html("Loading...");
            setTimeout(function () { LoadPartialView(); }, 5000);
        });
        function LoadPartialView() {
            $.ajax({
                type: "GET",
                url: '@Url.Action("GetPartialView", "Home")',
                dataType: "html",
                success: function (data) {
                    $("#content").empty();
                    $("#content").html(data);
                    $("#content").fadeIn('slow');
                },
                error: function (data) {
                    $("#content").empty();
                }
            });
        };
    </script>
    

    型号

    public class TestModel
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }
    

    控制器的操作

        [HttpPost]
        public PartialViewResult GetPartialView()
        {
            TestModel model = new TestModel();
    
            model.Name="SomeName";
            model.Address="Somewhere";
            model.Age=25;
    
            return PartialView("_PartialTestPage", model);
        }
    

    更新

    为避免硬编码访问部分视图,请使用将重定向到主视图的重载操作方法。像这样的。

        [HttpGet]
        [ActionName("MyOverloadedName")]
        public ActionResult GetPartialView()
        {
            return RedirectToAction("Index", "Home"); //redirect to the main view
        }
    

    您可以通过设置 HttpGet/HttpPost 来创建两个不同的同名操作方法。 在此处查看更多替代解决方案Can you overload controller methods in ASP.NET MVC?

    【讨论】:

    • 是的,但是如果您在导航器中输入部分视图的 url(例如mycompany.com/home/GetPartialView),它将全屏加载。我们想要实现(Windows Azure 已经成功实现)是加载主页,然后加载相关 div ID 中的局部视图。
    • 为了进一步阐明预期结果:如果我在导航栏中输入 testpage.com/controller/bananastestpage.com/controller/Apples 其中 /controller/bananas 和 /controller/Apples 是部分视图,我希望结果是图片张贴在我的问题中。我相信您的回答不会神奇地加载包含 div id="content" 的父容器页面。
    • 一旦有人尝试通过 url 直接访问,您可以重定向到主视图。请参阅我在答案中添加的示例。
    • 感谢 Ashwini,它接近预期的结果。如果来自 Get,您的更新将重定向到主视图。现在缺少的是,一旦我们加载了主视图,我们应该能够加载最初调用的局部视图。也许将url作为参数传递给控制器​​中的Index函数,该函数将修改js代码并调用document.ready函数中的部分视图?
    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多