这是一个概述;我有一个数据表的视图,并在更改我调用的过滤器选项(复选框) 一个过滤器操作,做一些工作,然后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
有人知道为什么它不刷新或呈现更新的过滤数据,即使我可以单步执行并查看 我期待什么?
答案 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内容。您需要更改操作方法以返回部分视图。