【问题标题】:jquery $.Post doesnt change view. What do I do?jquery $.Post 不会改变视图。我该怎么办?
【发布时间】:2010-02-25 20:23:40
【问题描述】:

我对 MVC 很陌生,所以这似乎是一个显而易见的问题,但是当发布到我的 ActionResult 时,会调用 ActionResult,但 View 不会改变。

我正在做的是有一个基本的搜索页面,用户可以在其中搜索我的数据库并返回结果并进行分页。

这是在我的控制器中调用 ActionResult 的 javascript。

    function SubmitSearch() {

    var searchBox = document.getElementById('searchBox');

    $.post("MyController/SearchResults/",
    {
        searchString: searchBox.value,
        page: 0
    });

    window.location = "../DriverStudio/Drivers/SearchResults/" + searchBox.value + '/0';
}

我当前的解决方案(这是一个可怕的 hack)是注释掉 $.post(因为我的路线设置的方式是 window.location 将调用 SearchResutls ActionResult)并将 window.location 设置为用户搜索,从第 0 页开始。

必须有更好的方法。我该怎么办?

【问题讨论】:

    标签: jquery asp.net-mvc view .post


    【解决方案1】:

    我不熟悉 MVC,但是除了将用户重定向到你在 window.location 中的 URL 之外,你的 ActionResult 还能做什么?

    你可能需要实现一个回调,来自jQuery docs

     jQuery.post( url, data, callback, type )
    

    所以你传递的是 URL 和数据,但没有关于你想对返回的数据做什么。

     $.post( "MyController/SearchResults/", 
             {searchString: searchBox.value,page: 0},
             function(result){
                    //do something with what your actionresult returns here
                    window.location = result.url;
             }
           );
    

    【讨论】:

    • 嗯,这似乎是门票。 'result.url' 不起作用。如果我提醒“结果”,我会得到视图(所以 DOCTYPE....等等的东西)。我如何从那里获取网址?
    • 如果你要转身通过设置 url 来做一个普通的 GET,为什么还要发 AJAX 帖子?
    • 我认为按照 tvanfosson 描述的方式,将 HTML 插入到 div 中。不过,您可能只想提取 body 标记中的元素。
    • 听起来你想要局部视图。我对 MVC 不太熟悉。
    • 我想你想要一个局部视图,否则那些正则表达式解决方案或某种将 html 解析为 xml 然后加载节点是我能想到的。
    【解决方案2】:

    设置您的 SearchResults 操作以返回部分视图,该部分视图仅包含执行搜索时要更新的页面部分。这件应该包含在一些容器中,以便于更换。然后使用 post 方法上的回调机制将该 DIV 的内容替换为从 SearchResults 操作返回的部分视图结果。从您的处理程序返回 false 以停止执行默认提交操作。

    function SubmitSearch() { 
    
        var searchBox = $('#searchBox'); 
    
        $.post("MyController/SearchResults/", 
        { 
            searchString: searchBox.val(), 
            page: 0 
        }, function(data) {
            $('#searchResults').html( data );
        }); 
    
        return false;
    }
    

    这假设一些视图代码看起来像:

     <% using (Html.BeginForm()) { %
          <label for="searchBox">Search:</label>
          <%= Html.TextBox("searchBox") %>
     <% } %>
     <div id="searchResults">
     </div>
    

    【讨论】:

    • 谢谢 tvan。它必须是局部视图吗?为什么我不能返回整个视图?
    • @Darcy - 这基本上与进行普通(非 AJAX)帖子相同。使用局部视图只会发送更新的部分,这就是使用 AJAX 的重点。
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2023-04-01
    • 2019-10-02
    • 2019-10-03
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多