【问题标题】:Reloading main view after button in PartialView is clicked单击 PartialView 中的按钮后重新加载主视图
【发布时间】:2012-07-06 14:12:59
【问题描述】:

我有一个部分视图,用户可以在其中执行搜索,搜索结果显示在选择框中。在我的主视图中,我有一个部分应该在按下选择按钮后显示搜索结果。现在,当我单击选择按钮时,会将正确的信息加载到我的主视图的正确模型中,但主视图不会改变。当我单击刷新时,页面会正确更新。如何在插件视图中单击按钮时自动更新页面?

我的主视图中的部分 (Index.vbhtml) 在我的主应用程序中:

@Section CUInfo

 Credit Union Name: @Model.CUInfo.CUName

 end section

这是我的插件中的控制器方法:

Function ChangeCUInfo(strCUName As String) As ActionResult
        m_hostApp.CUInfo.CUName = strCUName
        m_hostApp.blnPluginRefreshButtonPressed = True
        Return View("Index", m_hostApp)
    End Function

我尝试在 hostApp 对象中设置一个布尔值,然后在我的主 razor 视图中调用此函数(如果为真):

@code
     If Model.blnPluginRefreshButtonPressed = True Then


         @<script type="text/javascript">
              $(function () {
                  window.location.reload();
              });
         </script>


      End If

      Model.blnPluginRefreshButtonPressed = False
End Code

编辑:

点击选择按钮时调用的JS函数:

function loadCU(CUInfo) {
           strCU = CUInfo.split('|');
           strCUName = strCU[0];         
           $.ajax({
           type: "POST",
           url: "/CUContractNumberPlugin/ChangeCUInfo",
           data: { "strCUName": strCUName }
       });
       }

插件视图中使用的表单:

@Using (Html.BeginForm("ChangeCUInfo", "CUContractNumberPlugin"))
                 @<div id="LogoSigSearch" style="height:300px;width:500px;position:relative;">



    <span style="display:inline-block;height:20px;width:166px;position:absolute;top:35px;left:5px;">Credit Union Name</span>


    <br />
     @Html.TextBox("strCUName")
    <input type="submit" name="LogoSigSearch$ctl02" value="Search" id="LogoSigSearch_ctl02" tabindex="3" style="width:60px;position:absolute;top:5px;left:352px;" />






    <input name="LogoSigSearch$ctl05" type="button" onclick="javascript:clearSearch()" value="Clear" style="position:absolute;top:35px;left:352px;width:60px;" />

    <select size="4" name="LogoSigSearch$ctl06" id="LogoSigSearch_ctl06" tabindex="5" style="height:230px;width:342px;position:absolute;top:65px;left:5px;"></select>

    <input type="button" name="SelectCU" value="Select" onclick="javascript:loadCU(LogoSigSearch_ctl06.options[LogoSigSearch_ctl06.selectedIndex].value)"  tabindex="4" style="width:60px;position:absolute;top:65px;left:352px;" />
        </div>
    End Using

【问题讨论】:

  • 您要重新加载整个页面还是只加载主视图中的搜索结果?无论哪种情况,您都可以通过向按钮单击添加事件处理程序来使用 jQuery 执行此操作。
  • @lopezbertoni:这对我来说并不重要。我只希望单击提交按钮时搜索结果出现在主视图中。我会把jQuery放在插件中吗?如果是这样,我如何让它将该事件传递给主应用程序?如果它在主应用程序中,我如何让插件触发事件?
  • 就像@misterjames 所说的“使用局部视图呈现查询结果,即使在主页加载时也是如此。这简化了您的开发。”这是实现您想要的目标的关键。您可以使用 jQuery 从局部视图更新主视图。
  • 您需要避免告诉浏览器在按下按钮时重新加载自身。你不想重新加载你的整个页面,你在这里错过了 Mvc/jQuery/Ajax 的好处。查找RenderPartial 并走局部视图的路线,然后按照我在下面指定的那样实现按钮单击处理程序。

标签: asp.net-mvc-3 razor mef partialviews


【解决方案1】:

两个按钮都是表单的一部分吗?除非您将按钮附加到脚本或使其成为具有关联操作的表单的一部分,否则按钮不会调用操作。

使用局部视图来呈现查询结果,即使在主页加载时也是如此。这简化了您的开发。

添加一个 jQuery 事件处理程序 (jQuery.on()) 来监视主页上的按钮单击,或者如果按钮在局部视图中返回,只需在局部视图中使用准备就绪处理程序并附加一个 button.click () 事件,再次使用 jQuery。

jQuery 事件处理程序可以处理提交查询的值、发布到您的控制器以及显示结果。我有一些较旧的文章here,但它们仍然与您的问题相关,并展示了提交数据和获取部分数据。

您的客户端代码最终将如下所示:

 $("#your-button").click(function () {
    var fetchUrl = '@Url.Action("ActionName", "Controller")';

    $.post(fetchUrl, { searchParams: $("#your-search-box").val() })
        .success(function (data) {
          // replace the contents of the DIV with the results. 'data' 
          // here has whatever you sent back from your partial view
        })
        .error(function (data) { 
          // handle the error, use a DIV with some kind of alert message etc
        });

});

希望这会有所帮助。

【讨论】:

  • 选择按钮和选择列表都在一个表单中。单击按钮时,它会调用一个 JavaScript 函数,该函数解析来自选择列表的信息并将其传递给控制器​​操作。然后,该操作会更改从主机应用程序导入的模型的信息。然后插件的控制器返回宿主应用的Index.vbhtml。我将使用插件视图中的代码更新问题。
  • 我还将在主机应用程序中显示 CUName 的视图更改为 CUInfoPlugin 的部分视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多