【问题标题】:MVC Jquery Ajax updating your Partial ViewMVC Jquery Ajax 更新您的部分视图
【发布时间】:2011-11-08 02:41:21
【问题描述】:

我有一个 MVC 3 应用程序,它正在调用它使用的 Web 服务来调用 Sharepoints API。无论您的结果如何,该调用大约需要 6 秒,因此我决定使用 JQuery 添加一个异步调用,为用户提供等待指示器。我几乎已经完成了竞争,但我无法使用返回的数据更新视图。我已将其缩小到视图,因为当我到达包含数据的部分视图时,我在 ForEach 循环中有一个断点,那里有数据,这是我所期望的,但是当我到达在浏览器中查看自身,表格未填充。这是我在单击输入按钮时启动的 AJAX 调用,触发效果很好:

$(function () {
            $("#ajax-indicator").hide();
        });

        function getData() {
            $("#ajax-indicator").show();

            $.ajax({
                type: "POST",
                url: "/Home/MakeCall",
                // the URL of the controller action method 
                data: null,
                // optional data          
                success: function (result) {
                    // do something with result  
                    $("#ajax-indicator").toggle();
                },
                error: function (req, status, error) {
                    // do something with error     
                }
            });

        }

这是在同一个视图中,一个被隐藏的指示器 div,按钮,最后是渲染部分。

 <div id="ajax-indicator">
        <img alt="AJAX Indicator" src="<%= Url.Content("../../images/ajax-loader.gif") %>" />
    </div>
    <div id='button'>
        <% using (Html.BeginForm())
           { %>
               <input type="submit" name="submit" value="Get Data" onclick="getData();" />
           <% } 
        %>
    </div>


    <% Html.RenderPartial("MakeCall", ViewData["viewModel"]); %>

部分页面如下所示:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AsyncCallTest.Models.SharepointModel>" %>
<table border="1">
<tr>
<td>Folder Name</td>
<td>Link</td>
</tr>

<tr>

<% if (Model != null)
   {
       foreach (var item in Model.FolderList)
       {
       %>
    <td> FolderName: <%: item.FolderName%></td>
       <%
       }
   }

     %>
     </tr>
     </table>

当我查看 item.FolderName 时,我在那里有数据,但我们得到了 nada。我觉得我错过了一些愚蠢的东西。有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc jquery


    【解决方案1】:

    除了切换等待指示器之外,您没有做任何事情来显示成功中的数据。

    success: function (result) {
        // do something with result  
        $("#ajax-indicator").toggle();
    },
    

    您必须呈现从 AJAX 调用获得的结果。添加一个div(占位符)来显示结果,然后

    success: function (result) {
        // do something with result  
        $("#placeHolderSelector").html(result); // Render the result
        $("#ajax-indicator").toggle();
    },
    

    由于这个调用现在是异步的,你可以删除

    <% Html.RenderPartial("MakeCall", ViewData["viewModel"]); %>
    

    从视图中取而代之的是一个占位符

    <div id="placeHolderSelector"></div>
    

    【讨论】:

    • 好的,我会试一试,所以我假设,即使模型被填充,我的部分视图也是在视图渲染正确之后?
    • @user479323 :如果您想显示格式化数据,就像您使用部分视图的方式一样,那么您可以使用 jQuery 模板。 jQuery 模板,通过异步调用简化客户端绑定过程。
    • @PawanMishra 谢谢我正在研究模板的想法。我想我最大的担忧是丢失了我的强类型数据并将其塞入该 .HTML 属性中。是否有更好的 MVC 解决方案可以包含强类型数据并更好地与 MVC 配合使用??
    【解决方案2】:

    @PawanMishra 谢谢我正在研究模板的想法。我猜我的 最大的担忧是丢失了我的强类型数据并且只是推它 进入那个 .HTML 属性。有没有更好的 MVC 解决方案 将包含强类型数据并更好地与 MVC 一起使用??

    对于强类型实现,您将不得不使用基于“视图模型”的纯方法。在我最近的一个项目中,我们决定不使用 jQuery/JavaScript,而是使用“ViewModel”对象在视图和控制器之间传递数据。是的,我们得到了强类型行为,但是我们失去了从 jQuery 异步更新 UI 的魅力。由于该应用程序是供内部使用的,因此问题不大。它要求您按照自己的意愿去做,即使用 jQuery/JavaScript 或强类型视图控制器交互的流畅 UI。

    【讨论】:

    • 谢谢Pawan - 让我重新表述一下这个问题......有没有办法异步更新视图并仍然保留强类型数据?如果是这样,这方面的一些例子是什么?
    • 我认为不可能。这里的异步意味着通过 jQuery 调用操作方法,然后使用响应来更新 UI 或使用异步控制器。使用基于 jQuery 的方法,您不会得到强类型检查。正如我之前提到的,只有在使用纯“ViewModel”对象在视图和操作之间进行通信时,才能进行强类型检查。
    • 在实际的MVC框架中,数据和视图之间的传递没有异步方法吗?有一个 Ajax 命名空间吗?我找到了 Ajax.actionMethod,但它似乎不起作用。对此有何想法或使用此方法的示例?
    • 我认为“Ajax.actionMethod”用于将复杂的视图模型对象从 jQuery 传递到操作方法。最近在 MVC 3 中添加了这个(或类似的)方法。在此之前,人们很难将复杂的模型对象从脚本传递到动作方法。看到这个线程:stackoverflow.com/questions/4120212/…
    • 对不起,我是个害虫,但我刚刚发现了一些我认为我会从你身上反弹的东西。异步控制器?看东西链接; msdn.microsoft.com/en-us/library/ee728598%28VS.100%29.aspx 它声明它是为我正在做的事情而设计的……长的 Web 服务调用。但我不确定我在哪里可以给用户通知,这真的是我想要完成的吗?感谢大家的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多