Asp.net mvc 4 在MVC4.0中,RedirectToAction不会将PartialView呈现为Partial,而是发送整个页面

Asp.net mvc 4 在MVC4.0中,RedirectToAction不会将PartialView呈现为Partial,而是发送整个页面,asp.net-mvc-4,c#-5.0,asp.net-mvc-partialview,Asp.net Mvc 4,C# 5.0,Asp.net Mvc Partialview,我有点复杂,但我不明白为什么它不起作用: 我在Index.cshtml中有一个JSTree。当选择一个节点时,我对 public async Task<ActionResult> GetEBooksItems(string id) 公共异步任务GetEBooksItems(字符串id) 返回部分视图。这非常有效 现在,除了树搜索,我还有一个表单可以添加一些标准来缩小搜索范围。我使用Ajax.BeginForm将数据发回控制器 public async Task&l

我有点复杂,但我不明白为什么它不起作用: 我在Index.cshtml中有一个JSTree。当选择一个节点时,我对

public async Task<ActionResult> GetEBooksItems(string id)
公共异步任务GetEBooksItems(字符串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 });                                    
    }
public异步任务GetEBooksCustom(GenericSearchViewModel筛选器)
{            
vm=过滤器;
//会话[“GenreNodeId”]=id;
会话[“SearchCondition”]=(string.IsNullOrEmpty(vm.Condition)!=true)?vm.Condition:“All”;
会话[“MaximumPrice”]=(string.IsNullOrEmpty(vm.MaxPrice)!=true)?vm.MaxPrice:“999999”;
会话[“MinimumPrice”]=(string.IsNullOrEmpty(vm.MinPrice)!=true)?vm.MinPrice:“0”;
会话[“SearchIndex”]=(string.IsNullOrEmpty(vm.SearchIndex)!=true)?vm.SearchIndex:“KindleStore”;
会话[“SortOrder”]=(string.IsNullOrEmpty(vm.SortOrder)!=true)?vm.SortOrder:“price”;
会话[“关键字”]=(string.IsNullOrEmpty(vm.KeyWords)!=true)?vm.KeyWords:;
会话[“Title”]=(string.IsNullOrEmpty(vm.Title)!=true)?vm.Title:;
会话[“Author”]=(string.IsNullOrEmpty(vm.Author)!=true)?vm.Author:;
返回RedirectToAction(“GetEBooksItems”,new{id=vm.CategoryNodeId});
}
对于此方法,wich依次使用RedirectToAction调用第一个方法

我一直在尝试我能想到的一切,我总是得到整个页面的结果,而不是像第一种方法那样的局部视图

看起来对GetEBooksCustom的调用并没有被“看作”Ajax调用。 我错过了什么? 谢谢你的帮助, 伯纳德

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

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

问题是,我在其他地方基本上有相同的表单,在那里它按预期工作。看不出有什么不同

一如既往,感谢您的帮助和建议。
Bernard

我认为这是因为
重定向到操作
会将302返回到您的浏览器,指示它,确切地说,重定向到另一个操作。您的浏览器通过重定向整个页面来处理此问题。您应该(在某种程度上取决于
GetEBooksItems
方法的内容),只需直接调用另一个方法,而不是使用重定向即可绕过此问题:

return GetEBooksItems(vm.CategoryNodeId);
或者,更好的办法是,将
getebookscitems
中的逻辑抽象成一个单独的方法,在
GetEBooksCustom
中重用它,并直接返回
PartialView
。这样你就根本不必处理重定向问题。

我最终使用的是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();
    });

是的,这正是我在仔细思考后所想的。我需要一种方法返回“vm”的主要部分,这样我就可以将其与partialView一起返回,而不是使用重定向到操作。谢谢!有时候,只要问一下,并用第二双眼睛看一下,就足够得到答案了……:)