MVC RedirectToAction不在View中呈现更新的html

时间:2010-10-22 16:45:24

标签: asp.net-mvc

这是一个概述;我有一个数据表的视图,并在更改我调用的过滤器选项(复选框) 一个过滤器操作,做一些工作,然后redirecttoAction到主动作接受我的过滤器信息。 在调试中单步执行我可以看到通过操作传递的预期数据,甚至可以在带有的视图上看到 构建html,但是预期会有更多或更少行的html不会呈现 - 它保持不变 默认过滤列表。

以下是一些代码。

带复选框的HTML:

<fieldset>
<legend style="color: #27568e;">Filter</legend>
    <table id="Filter">
        <thead>
        </thead>
        <tbody>
            <tr>
                <td>
                <input type="checkbox"  value="14" name="filterList" checked="checked"/>Type1
                <input type="checkbox"  value="15"name="filterList" checked="checked"/>Type2
                <input type="checkbox"  value="16" name="filterList" />Type3
                <input type="checkbox"  value="17"  name="filterList" />Type4
                <input type="button" value="Filter" id="Filterbutton" onclick="getFilterList('<%= Model.myId %>','filterList');" />
                </td>
            </tr>
        </tbody>
    </table>
 </fieldset>

使用Javascript / JQuery的

<script type="text/javascript">

function getFilterList(id, checklist) 
   {
       var data = {};
       var resultString = new String;
       var selected = new Array();
       var loopCounter = 0;
       jQuery("input[name=" + checklist + "]:checked").each(function () {
           //selected[loopCounter] = jQuery(this).val();
           resultString += jQuery(this).val() + ",";
           loopCounter += 1;
       });
       resultString = resultString + id.toString();
       selected.push(id);

       jQuery.post("/MyContr/Filter/", { resultStr: resultString });

   };
</script>

在Controller中过滤操作 - MyContr:

[AcceptVerbs(HttpVerbs.Post)]
    public RedirectToRouteResult Filter(String resultStr)
    {
        string strList = string.Empty;
        Stack<string> myStack = new Stack<string>( resultStr.Split(new string[] { "," }, StringSplitOptions.None));
        // Remove the id 
        var id = Convert.ToInt64(myStack.Pop());
       //convert rest of values (selected checkbox values) to string and pass to Review *was not able to pass array
       //build strList
        while (myStack.Count > 0)
        { 
            strList += myStack.Pop() +",";
        }

       if (strList != string.Empty)
           strList = strList.Remove(strList.Length - 1, 1); //remove last comma

        return RedirectToAction("Review", "myContr", new{id=id,filterList=strList});
    }

审核控制器中的操作 - MyContr:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Review(long id, string filterList)
    {

        string[] strArray = new string[]{}; 
        int[] filterArray;

        if (filterList == null)
        {
            filterArray = new int[] { 14, 15 };//default to specific types
        }
        else
        {  //if filterList is not null

            strArray = filterList.Split(new string[] { "," }, StringSplitOptions.None); //split string into array
            //convert str[] to int[]
            filterArray = new int[strArray.Length];
            for (int x = 0; x < strArray.Length; x++)
            {
                filterArray[x] = Convert.ToInt32(strArray[x].ToString());
            }

        }
        var myData = something.GetMyData(id);

        ViewData["checkboxes"] = filterArray;
        return View(myData);
    }

我的视图输出已过滤的列表 fieldset中的数据行由其构建的表 foreach(MyFilteredData中的项目)

*我的视图中的html包含在没有打开和关闭html标记的asp:Content块中

第一次正确加载页面,默认过滤器显示表格中正确的行数; 更改复选框以添加到筛选列表不会按预期更新html;然而,当我调试并逐步完成时 代码,正确的数据通过动作传递回视图;好像它只是没有呈现新的/更新的 HTML

有人知道为什么它不刷新或呈现更新的过滤数据,即使我可以单步执行并查看 我期待什么?

2 个答案:

答案 0 :(得分:1)

我不是jQuery专家,但你的post方法是否需要指定一个回调函数,将返回的html添加到DOM中的元素?

来自jquery的页面:

$.post('ajax/test.html', function(data) {
  $('.result').html(data);
});

http://api.jquery.com/jQuery.post/

返回的html通过html方法附加到.result类的元素。

更多来自jquery的页面:

  

示例:请求test.php页面,   但忽略返回结果。

$.post("test.php");
  

示例:请求test.php页面和   发送一些额外的数据(同时   仍然无视返回结果)。

$.post("test.php", { name: "John", time: "2pm" } );

答案 1 :(得分:1)

您的代码有2个问题。正如@Francis Noriega指出的那样,你的jquery中需要有一个回调函数来将返回的视图填充回页面。

然而,更大的问题是:

return RedirectToAction("Review", "myContr", new{id=id,filterList=strList});

这会将HTTP 302(重定向)返回到您的jquery调用代码,而不是被调用操作的html内容。您需要更改操作方法以返回部分视图。