首页 > 解决方案 > ASP.NET MVC5 - 返回部分视图后不执行 RenderPartial()

问题描述

我有以下代码:

查看

@model IEnumerable<FormBuilder.Model.Formular>

<div id="divAktiveFormulare">
   @{ Html.RenderPartial("Formular/TableAllFormulare", Model.Where(model => model.Status == FormularStatus.Aktiv).ToList()); }
</div>

<div id="divArchivierteFormulare">
    @{ Html.RenderPartial("Formular/TableAllFormulare", Model.Where(model => model.Status == FormularStatus.Archiviert).ToList()); }
</div>

function btnArchivieren(e) {
   $.ajax({
       url: 'Url.Action("Archive", "Formular")',
       data: { id: e.target.name },
       success: function (data) {
          $('#divArchivierteFormulare').html(data);
       }
   });         
}

控制器

public ActionResult Index()
{
     List<Formular> aktiveformulare = _formularManager.GetAllFormulare();
     return View(aktiveformulare);
}  

public ActionResult Archive(int id)
{
      Formular formular = _formularManager.GetFormularByID(id);

      if (formular != null)
      {
           formular.Status = FormularStatus.Archiviert;
           _formularManager.UpdateFormular(formular);
      }

      return PartialView("Formular/TableAllFormulare", _formularManager.GetAllFormulare());
 }

我有两个 div (divAktiveFormularedivArchivierteFormulare)。在它们中的每一个中都呈现了部分视图。部分视图显示了模型项的表(模型是 an IEnumerable),每个视图在枚举 (fe ) 之后都有一个过滤模型Html.RenderPartial("Formular/TableAllFormulare", model => model.Status == FormularStatus.Archiviert

第一次加载索引页面时,一切正常。我可以在RenderPartial()-lines 处设置一个断点,它会停在那里。两个局部视图都在过滤模型后正确显示其表格。

在我的页面上,我有一个按钮,按下它会启动 Javascript btnArchivieren,它将一个 ajax 发送到控制器。该操作将返回Partial View()带有更新模型的 a。

但是现在我的刹车点RenderPartial()不会再次被触发。好吧,div 已更新,是的,但没有过滤部分视图的模型 ( Model.Where(model => model.Status == FormularStatus.Archiviert)。两个部分视图都显示了没有通过枚举过滤的表格。就像我说的,我的刹车点甚至没有被触发。

我究竟做错了什么?为什么RenderPartial()从带有更新模型的控制器返回部分视图后不执行 -lines?

标签: asp.netasp.net-mvcasp.net-ajaxpartial-views

解决方案


当你使用:

@{ Html.RenderPartial("Formular/TableAllFormulare", Model.Where(model => model.Status == FormularStatus.Aktiv).ToList()); }

您告诉您的应用程序它必须使用您提供的数据调用您的局部视图“Formular/TableAllFormulare”。

它仅在渲染所有页面时完成,而不是通过在 ajax 中调用它。

将由 ajax 调用执行的部分视图中的代码。

无论如何,我建议将断点放在控制器中的这一行:

Formular formular = _formularManager.GetFormularByID(id);

因为它将被执行的那一行,并且可能是错误隐藏的地方。


编辑 :

你只需要这样做:

return PartialView("Formular/TableAllFormulare", _formularManager.GetAllFormulare().Where(model => model.Status == FormularStatus.Archiviert).ToList());

我希望你明白为什么它一开始不会像你预期的那样工作,所以如果你不明白,请告诉我。我会尝试更好地解释它。


推荐阅读