Javascript 调用控制器ActionResult修改ViewBag变量并重新加载视图?
我有一个MVC5应用程序。应用程序加载时MyHomeController将填充一个简单列表,该列表通过ViewBag传递到索引视图,并将我的模型传递到视图。在视图中,我还有一个网格组件,其分页大小由ViewBag变量设置(加载时,默认为10条记录): 我不知道如何用新选择的Javascript 调用控制器ActionResult修改ViewBag变量并重新加载视图?,javascript,jquery,json,asp.net-mvc,viewbag,Javascript,Jquery,Json,Asp.net Mvc,Viewbag,我有一个MVC5应用程序。应用程序加载时MyHomeController将填充一个简单列表,该列表通过ViewBag传递到索引视图,并将我的模型传递到视图。在视图中,我还有一个网格组件,其分页大小由ViewBag变量设置(加载时,默认为10条记录): 我不知道如何用新选择的分页间隔重新加载视图。在我的尝试中,我创建了我的Index()控制器操作的副本,该操作需要一个参数值,该参数值应在ViewBag中使用,并传递给视图以设置分页记录的新选择: public ActionResult NewPag
分页间隔重新加载视图。在我的尝试中,我创建了我的Index()
控制器操作的副本,该操作需要一个参数值,该参数值应在ViewBag中使用,并传递给视图以设置分页记录的新选择:
public ActionResult NewPagingInterval(string selection)
{
List<SelectListItem> pagingIntervalList = new List<SelectListItem>();
pagingIntervalList.Add(new SelectListItem { Text = "5", Value = "5" });
pagingIntervalList.Add(new SelectListItem { Text = "10", Value = "10" });
pagingIntervalList.Add(new SelectListItem { Text = "25", Value = "25" });
pagingIntervalList.Add(new SelectListItem { Text = "50", Value = "50" });
pagingIntervalList.Add(new SelectListItem { Text = "100", Value = "100" });
pagingIntervalList.Add(new SelectListItem { Text = "250", Value = "250" });
pagingIntervalList.Add(new SelectListItem { Text = "500", Value = "500" });
ViewBag.pagingIntervalList = pagingIntervalList;
// Set paging to user selected value.
ViewBag.PageSize = selection;
var assetList = db.INV_ASSETS.ToList();
return View(assetList);
}
然后,我想也许我可以通过URL传递参数来调用我的newpaginterval(字符串选择)
控制器操作,最终我将以下内容组合在一起:
$("#pagingIntervalList").on("change", function (e) {
window.location = "/Home/NewPagingInterval?selection=" + $("#pagingIntervalList").val();
});
这将成功调用控制器上的myNewPaginInterval(字符串选择)
操作,但在返回视图(assetList)
后,我得到:
Server Error in '/' Application.
The view 'NewPagingInterval' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/NewPagingInterval.aspx
~/Views/Home/NewPagingInterval.ascx
~/Views/Shared/NewPagingInterval.aspx
~/Views/Shared/NewPagingInterval.ascx
~/Views/Home/NewPagingInterval.cshtml
~/Views/Home/NewPagingInterval.vbhtml
~/Views/Shared/NewPagingInterval.cshtml
~/Views/Shared/NewPagingInterval.vbhtml
~/__MVCSITEMAPPROVIDER/NewPagingInterval.ascx
有经验的人能看到我哪里出了问题,或者有更好的想法来实现我的目标吗
正在尝试haim的Git示例:
// Initial Controller Action -- Loads Fine
public ActionResult Index(int pageSize = 10)
{
List<SelectListItem> pagingIntervalList = new List<SelectListItem>();
pagingIntervalList.Add(new SelectListItem { Text = "5", Value = "5" });
pagingIntervalList.Add(new SelectListItem { Text = "10", Value = "10" });
pagingIntervalList.Add(new SelectListItem { Text = "25", Value = "25" });
pagingIntervalList.Add(new SelectListItem { Text = "50", Value = "50" });
pagingIntervalList.Add(new SelectListItem { Text = "100", Value = "100" });
pagingIntervalList.Add(new SelectListItem { Text = "250", Value = "250" });
pagingIntervalList.Add(new SelectListItem { Text = "500", Value = "500" });
ViewBag.pagingIntervalList = pagingIntervalList;
// Set default paging to 10 records on Load.
ViewBag.PageSize = pageSize;
var assetList = db.INV_ASSETS.ToList();
return View(assetList);
}
// Form & DropDown
<form id="pagingIntervalForm" method="post" action="@Url.Action("NewPagingInterval", "HOME")">
<span class="gridPagerInterval label label-primary">Page every @Html.DropDownList("pagingIntervalList") Records. </span>
</form>
// Submit Form -- successfully calls NewPagingInterval Controller Action
// value of "selection" parameter is NULL!
$("#pagingIntervalList").on("change", function (e) {
$('#pagingIntervalForm').submit();
});
// Successfully called, but returns nothing but the raw data in text format of my Model.ToList().....?
public ActionResult NewPagingInterval(string selection)
{
List<SelectListItem> pagingIntervalList = new List<SelectListItem>();
pagingIntervalList.Add(new SelectListItem { Text = "5", Value = "5" });
pagingIntervalList.Add(new SelectListItem { Text = "10", Value = "10" });
pagingIntervalList.Add(new SelectListItem { Text = "25", Value = "25" });
pagingIntervalList.Add(new SelectListItem { Text = "50", Value = "50" });
pagingIntervalList.Add(new SelectListItem { Text = "100", Value = "100" });
pagingIntervalList.Add(new SelectListItem { Text = "250", Value = "250" });
pagingIntervalList.Add(new SelectListItem { Text = "500", Value = "500" });
ViewBag.pagingIntervalList = pagingIntervalList;
// Set paging to user selected value.
ViewBag.PageSize = selection;
var assetList = db.INV_ASSETS.ToList();
return Json(assetList);
}
//初始控制器操作--加载正常
公共行动结果索引(int pageSize=10)
{
列表分页IntervalList=新列表();
paginIntervalList.Add(新建SelectListItem{Text=“5”,Value=“5”});
paginIntervalList.Add(新建SelectListItem{Text=“10”,Value=“10”});
paginIntervalList.Add(新建SelectListItem{Text=“25”,Value=“25”});
paginIntervalList.Add(新建SelectListItem{Text=“50”,Value=“50”});
paginIntervalList.Add(新建SelectListItem{Text=“100”,Value=“100”});
paginIntervalList.Add(新的SelectListItem{Text=“250”,Value=“250”});
paginIntervalList.Add(新的SelectListItem{Text=“500”,Value=“500”});
ViewBag.PaginIntervalList=PaginIntervalList;
//将加载时的默认分页设置为10条记录。
ViewBag.PageSize=页面大小;
var assetList=db.INV_ASSETS.ToList();
返回视图(资产列表);
}
//表单和下拉列表
对每个@Html.DropDownList(“PaginIntervalList”)记录进行分页。
//提交表单--成功调用NewPaginInterval控制器操作
//“选择”参数的值为空!
$(“#PaginIntervalList”)。关于(“更改”,函数(e){
$(#paginIntervalform')。提交();
});
//已成功调用,但只返回my Model.ToList()文本格式的原始数据。。。。。?
公共操作结果NewPaginInterval(字符串选择)
{
列表分页IntervalList=新列表();
paginIntervalList.Add(新建SelectListItem{Text=“5”,Value=“5”});
paginIntervalList.Add(新建SelectListItem{Text=“10”,Value=“10”});
paginIntervalList.Add(新建SelectListItem{Text=“25”,Value=“25”});
paginIntervalList.Add(新建SelectListItem{Text=“50”,Value=“50”});
paginIntervalList.Add(新建SelectListItem{Text=“100”,Value=“100”});
paginIntervalList.Add(新的SelectListItem{Text=“250”,Value=“250”});
paginIntervalList.Add(新的SelectListItem{Text=“500”,Value=“500”});
ViewBag.PaginIntervalList=PaginIntervalList;
//将分页设置为用户选择的值。
ViewBag.PageSize=选择;
var assetList=db.INV_ASSETS.ToList();
返回Json(资产列表);
}
在您的NewPaginInterval操作中尝试以下操作:
ViewBag.PaginIntervalList=新选择列表(PaginIntervalList,“值”、“文本”、选择) 您的
$.ajax
代码意味着您希望服务器返回JSON
。通过在服务器中调用returnview()
,返回的不是JSON
,而是text/html
响应。另外,由于您没有真正创建该视图文件,因此会出现异常,表明该视图文件丢失改为code>。好的,我将返回视图(assetList)
更改为返回Json(assetList)
。这将重新加载我的视图,但我仍然只显示分页的默认10
记录,而不是我将下拉列表更改为的50
。成功返回后,我的ajax()
调用将指定location.reload(true)
,如果我理解正确,它只是刷新页面,而不是用新设置的ViewBag
变量重新填充视图。这就是为什么我尝试通过window.location
..传递参数的原因?如果您不做任何操作并立即刷新页面,那么从服务器返回JSON
有什么意义?如果您确实需要返回视图(选择正确的页面大小),请避免使用Ajax,只需将POST
发送到原始Index()
操作。您可以提供一个示例haim吗?我本来想再次调用Index()
操作,但我需要一种方法来指定用户通过下拉菜单选择的内容,并使用该新值来设置ViewBag
变量——按原样调用Index()
将始终导致10
页面分页设置。
$("#pagingIntervalList").on("change", function (e) {
window.location = "/Home/NewPagingInterval?selection=" + $("#pagingIntervalList").val();
});
Server Error in '/' Application.
The view 'NewPagingInterval' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/NewPagingInterval.aspx
~/Views/Home/NewPagingInterval.ascx
~/Views/Shared/NewPagingInterval.aspx
~/Views/Shared/NewPagingInterval.ascx
~/Views/Home/NewPagingInterval.cshtml
~/Views/Home/NewPagingInterval.vbhtml
~/Views/Shared/NewPagingInterval.cshtml
~/Views/Shared/NewPagingInterval.vbhtml
~/__MVCSITEMAPPROVIDER/NewPagingInterval.ascx
// Initial Controller Action -- Loads Fine
public ActionResult Index(int pageSize = 10)
{
List<SelectListItem> pagingIntervalList = new List<SelectListItem>();
pagingIntervalList.Add(new SelectListItem { Text = "5", Value = "5" });
pagingIntervalList.Add(new SelectListItem { Text = "10", Value = "10" });
pagingIntervalList.Add(new SelectListItem { Text = "25", Value = "25" });
pagingIntervalList.Add(new SelectListItem { Text = "50", Value = "50" });
pagingIntervalList.Add(new SelectListItem { Text = "100", Value = "100" });
pagingIntervalList.Add(new SelectListItem { Text = "250", Value = "250" });
pagingIntervalList.Add(new SelectListItem { Text = "500", Value = "500" });
ViewBag.pagingIntervalList = pagingIntervalList;
// Set default paging to 10 records on Load.
ViewBag.PageSize = pageSize;
var assetList = db.INV_ASSETS.ToList();
return View(assetList);
}
// Form & DropDown
<form id="pagingIntervalForm" method="post" action="@Url.Action("NewPagingInterval", "HOME")">
<span class="gridPagerInterval label label-primary">Page every @Html.DropDownList("pagingIntervalList") Records. </span>
</form>
// Submit Form -- successfully calls NewPagingInterval Controller Action
// value of "selection" parameter is NULL!
$("#pagingIntervalList").on("change", function (e) {
$('#pagingIntervalForm').submit();
});
// Successfully called, but returns nothing but the raw data in text format of my Model.ToList().....?
public ActionResult NewPagingInterval(string selection)
{
List<SelectListItem> pagingIntervalList = new List<SelectListItem>();
pagingIntervalList.Add(new SelectListItem { Text = "5", Value = "5" });
pagingIntervalList.Add(new SelectListItem { Text = "10", Value = "10" });
pagingIntervalList.Add(new SelectListItem { Text = "25", Value = "25" });
pagingIntervalList.Add(new SelectListItem { Text = "50", Value = "50" });
pagingIntervalList.Add(new SelectListItem { Text = "100", Value = "100" });
pagingIntervalList.Add(new SelectListItem { Text = "250", Value = "250" });
pagingIntervalList.Add(new SelectListItem { Text = "500", Value = "500" });
ViewBag.pagingIntervalList = pagingIntervalList;
// Set paging to user selected value.
ViewBag.PageSize = selection;
var assetList = db.INV_ASSETS.ToList();
return Json(assetList);
}