【问题标题】:with MVC 4.0, RedirectToAction does not render PartialView as Partial, it send a whole page使用 MVC 4.0,RedirectToAction 不会将 PartialView 呈现为 Partial,它会发送整个页面
【发布时间】:2013-04-14 10:50:39
【问题描述】:

我得到了一些复杂的东西,但我不明白为什么它不起作用: 我的 Index.cshtml 中有一个 JSTree。当一个节点被选中时,我对

进行 Ajax 调用
public async Task<ActionResult> GetEBooksItems(string id)

返回部分视图。这非常有效。

现在,除了树形搜索之外,我还有一个表单可以添加一些条件来缩小搜索范围。我使用 Ajax.BeginForm 将数据发布回控制器。

        public async Task<ActionResult> GetEBooksCustom(GenericSearchViewModel filter)
    {            
        vm = filter;
        //Session["GenreNodeId"] = id;
        Session["SearchCondition"] = (string.IsNullOrEmpty(vm.Condition) != true) ? vm.Condition : "All";
        Session["MaximumPrice"] = (string.IsNullOrEmpty(vm.MaxPrice) != true) ? vm.MaxPrice : "999999";
        Session["MinimumPrice"] = (string.IsNullOrEmpty(vm.MinPrice) != true) ? vm.MinPrice : "0";
        Session["SearchIndex"] = (string.IsNullOrEmpty(vm.SearchIndex) != true) ? vm.SearchIndex : "KindleStore";
        Session["SortOrder"] = (string.IsNullOrEmpty(vm.SortOrder) != true) ? vm.SortOrder : "price";
        Session["KeyWords"] = (string.IsNullOrEmpty(vm.Keywords) != true) ? vm.Keywords : "";
        Session["Title"] = (string.IsNullOrEmpty(vm.Title) != true) ? vm.Title : "";
        Session["Author"] = (string.IsNullOrEmpty(vm.Author) != true) ? vm.Author : "";
        return RedirectToAction("GetEBooksItems", new { id = vm.CategoryNodeId });                                    
    }

到这个方法,然后用 RedirectToAction 调用第一个方法。

我一直在尝试所有我能想到的方法,我总是以整个页面的形式获得结果,而不是像第一种方法那样获得部分视图。

看起来对 GetEBooksCustom 的调用没有被“视为”为 Ajax 调用。 我想念什么? 谢谢你的帮助, 伯纳德。

****6 小时后编辑* *********

在这期间我做了建议,即从“GetEBooksItems”中提取功能,以便能够直接返回 PartialView 而不是使用 RedirectToAction。在调试器中,看起来一切都很完美,我看到来自服务器的 200 响应,但我仍然得到一个完整的页面显示,并且 url 显示控制器方法,而这不应该是 ajax 调用的情况。

问题是,我在其他地方有基本相同的表格,它可以按预期工作。看不出有什么不同???

一如既往,感谢您的帮助和建议。 伯纳德

【问题讨论】:

    标签: asp.net-mvc-4 c#-5.0 asp.net-mvc-partialview


    【解决方案1】:

    我最终使用了jQuery Form plugin 而不是 Ajax.BeginForm。在为此浪费了几个小时之后,我花了大约 10 分钟才让它完全按预期工作!

    对于那些可能感兴趣的人,这里有两种编码:

        //using (Ajax.BeginForm("GetEBooksCustom", "Home", new AjaxOptions {
        //                            UpdateTargetId = "ListOfBooksHere", 
        //                          HttpMethod = "POST",                                    
        //                          OnBegin="ShowProcessingMsg",
        //                          OnComplete="HideProcessingMsg"
    
    
        $("#eBooksForm").ajaxForm({
            url: "/home/GetEBooksCustom",
            type: "POST",
            success: function(data) {
                $("#ListOfBooksHere").html(data);
            }
        });
    

    我没有打扰 OnBegin 和 OnComplete,因为我正在使用这个:

        $(document).ajaxSend(function() {
            $('.loadingIndicator').show();
        });
    
        $(document).ajaxComplete(function() {
            $('.loadingIndicator').hide();
        });
    

    【讨论】:

      【解决方案2】:

      我想这是因为RedirectToAction 向您的浏览器返回了一个 302,指示它从字面上看重定向到另一个操作。您的浏览器通过重定向整个页面来处理这个问题。您应该(取决于GetEBooksItems 方法的内容,可以通过直接调用其他方法而不是使用重定向来解决这个问题:

      return GetEBooksItems(vm.CategoryNodeId);
      

      或者,更好的是,将GetEBooksItems 中的逻辑抽象为一个单独的方法,在GetEBooksCustom 中重用它并直接返回PartialView。这样,您根本不必解决重定向问题。

      【讨论】:

      • 是的,这正是我想多了之后的想法。我需要一个方法返回“vm”的主要部分,这样我就可以将它与 partialView 一起返回,而不是使用 RedirectTo Action。谢谢!有时,只是问,再看一眼,就足以得到答案.... :-)
      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2023-03-20
      • 2019-05-30
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多