【问题标题】:Grid not updating after ajaxcallajaxcall 后网格不更新
【发布时间】:2013-08-26 22:53:56
【问题描述】:

我正在创建自己的过滤器。过滤器有一个下拉列表,当这个下拉列表更改时,jquery 将对相应的 HTTPPOST - 控制器操作进行 ajaxcall。在此操作中,我过滤列表并将其传递给我的视图。

一旦列表到达我的视野,webgrid 就不会更新。这是一些带有一些调试信息的代码,以显示正在发生的事情。

控制器

正常动作

    public ActionResult Projects() 
    {
        IEnumerable<Project> projects = Adapter.ProjectRepository.Get();
        int test = projects.Count();
        List<ProjectsDisplayViewmodel> projectsView = new List<ProjectsDisplayViewmodel>();
        string strCats = "";
        foreach (Project prj in projects)
        {
            strCats = "";
            Mapper.CreateMap<Project, ProjectsDisplayViewmodel>();
            ProjectsDisplayViewmodel newProject = Mapper.Map<Project, ProjectsDisplayViewmodel>(prj);
            foreach (Category cat in prj.Categories) 
            {
                strCats += cat.CategoryName + ", ";
            }
            newProject.strCategories = strCats;
            projectsView.Add(newProject);
        }

        ViewBag.Categories = new SelectList(Adapter.CategoryRepository.Get(), "CategoryID", "CategoryName");

       /*projectsview contains 4 projects now*/
        return View(projectsView);
    }

httppost 操作

[HttpPost]
        public ActionResult Projects(string catID, string strSearch)
        {
            IEnumerable<Project> projects = Adapter.ProjectRepository
                                                        .Get()
                                                        .Where(x => 
                                                            x.Categories.Any(
                                                                c => 
                                                                    c.CategoryID == Convert.ToInt16(19))

                                                    );
        int test = projects.Count();

        List<ProjectsDisplayViewmodel> projectsView = new List<ProjectsDisplayViewmodel>();
        string strCats = "";
        foreach (Project prj in projects)
        {
            strCats = "";
            Mapper.CreateMap<Project, ProjectsDisplayViewmodel>();
            ProjectsDisplayViewmodel newProject = Mapper.Map<Project, ProjectsDisplayViewmodel>(prj);
            foreach (Category cat in prj.Categories)
            {
                strCats += cat.CategoryName + ", ";
            }
            newProject.strCategories = strCats;
            projectsView.Add(newProject);
        }

        ViewBag.Categories = new SelectList(Adapter.CategoryRepository.Get(), "CategoryID", "CategoryName");

       /*projectsview contains 1 project now AND WILL DISPLAY 4*/
        return View(projectsView);
    }

project.cshtml

@model IEnumerable<Freelauncher.Models.ProjectsDisplayViewmodel>
@{
    ViewBag.Title = "Projects";
}

@{
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 25, 
    selectionFieldName: "selectedRow",ajaxUpdateContainerId: "gridContent");
        grid.Pager(WebGridPagerModes.NextPrevious);
} 

<h2>Alle projecten</h2>

@Html.DropDownList("Categories", (SelectList) ViewBag.Categories)

<div id="gridContent">
    @grid.GetHtml(
            columns: grid.Columns(
            grid.Column("ProjectTitle", "Titel"),
            grid.Column("ProjectDeadlineDate", "project deadline"),
            grid.Column("ProjectEndRegisterDate", "Registreer deadline"),
            grid.Column("ProjectBudget", "Prijs"),
            grid.Column("ProjectIsFixedPrice", "Vaste prijs"),
            grid.Column("strCategories","Categorieën"),
            grid.Column("ProjectID", "meer info", format: (item) => Html.ActionLink("info", "project", new { Id = item.ProjectID} ))
            //grid.Column("ProjectID", "meer info", format: Html.ActionLink("info", "project", new { Id = }
     ))
</div>

我错过了什么,我的视图中的项目列表没有更新,正确的数据被传递给视图....

编辑

ajax 调用

$("#Categories").change(function () {
    var param = $(this).val();

    $.ajax({
        type: "POST",
        url: "/Project/Projects",
        data: { catID: $(this).val(), strSearch: 'test' },
        dataType: "json",
        success: function (response) { console.log("succes"); },
        error: function (xhr, ajaxOptions, thrownError) {console.log("error"); }
    });
});

我刚刚注意到我的 console.log 中没有打印任何内容......不是成功也不是错误功能。

【问题讨论】:

  • 你能显示你在哪里进行 AJAX 调用的代码吗?还是Ajax.BeginForm
  • @DarinDimitrov 我认为是 WebGrid 正在处理它。
  • 您检查过 Chrome/Firefox/IE 控制台是否有错误?如果帖子到达服务器,可能是空响应或任何 java 脚本错误!
  • @DarinDimitrov 我在编辑中添加了 ajaxcall...在我的控制台中没有错误...
  • 是的,我明白了。但是除了将结果输出到控制台之外,您不会在成功回调中做任何事情。你需要让你的控制器动作返回一个包含更新网格的部分,你应该重新注入到 DOM 中。

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


【解决方案1】:

您似乎在 AJAX 请求的 success 回调中没有做任何事情(console.log 调用除外)。因此,没有任何更新是完全正常的。如果您希望发生这种情况,您需要手动更新您的 DOM。

因此您应该修改您的HttpPost 控制器操作,使其返回包含网格的PartialView。然后在你的成功回调中将新收到的部分注入 DOM:

success: function (response) { 
    $('#some_id_of_a_containing_div').html(response);
    console.log("succes"); 
},

在这个例子中,你应该将部分视图包装到一个包含 div 中,该 div 将在此处更新:

<div id="some_id_of_a_containing_div">
    @Html.Partial("Partial_Containing_Your_Grid")
</div>

【讨论】:

  • 嗯,我不明白为什么我需要在 jquery 中修改 html...我怀疑我与列表一起返回的视图会自动更改 webgrid...
  • 哦不,不会自动更新。您正在向返回某些内容(在您的情况下为视图)的控制器操作发出 AJAX 请求,但您应该在成功回调中对结果执行某些操作。否则不要指望会发生任何事情。现在你只是在做一个即发即弃的电话,丢弃结果。您从控制器操作返回 View 的事实并不意味着您的页面会自动更新。 jQuery 对视图一无所知。它甚至对 ASP.NET MVC 一无所知。
  • 好的,谢谢,我试试。现在必须去,如果它有效,明天会发布,或者我的问题是什么。提前致谢!
  • 在 ajaxcall 中我收到一个错误,所以 ajax 执行错误函数而不是 succes 函数...可能是什么问题?我的控制器的返回值为:return View(projectsView);而且我的控制器没有错误
  • 您确定视图存在吗?在 FireBug 中查看来自服务器的确切响应。
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2013-11-12
  • 2010-11-20
相关资源
最近更新 更多