Javascript 调用控制器ActionResult修改ViewBag变量并重新加载视图?

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

我有一个MVC5应用程序。应用程序加载时MyHomeController将填充一个简单列表,该列表通过ViewBag传递到索引视图,并将我的模型传递到视图。在视图中,我还有一个网格组件,其分页大小由ViewBag变量设置(加载时,默认为10条记录):

我不知道如何用新选择的
分页间隔重新加载视图。在我的尝试中,我创建了我的
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();
});
这将成功调用控制器上的my
NewPaginInterval(字符串选择)
操作,但在返回视图(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
响应。另外,由于您没有真正创建该视图文件,因此会出现异常,表明该视图文件丢失。好的,我将
返回视图(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);
    }