Asp.net mvc 4 在MVC4.0中,RedirectToAction不会将PartialView呈现为Partial,而是发送整个页面
我有点复杂,但我不明白为什么它不起作用: 我在Index.cshtml中有一个JSTree。当选择一个节点时,我对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
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一起返回,而不是使用重定向到操作。谢谢!有时候,只要问一下,并用第二双眼睛看一下,就足够得到答案了……:)