这是一个概述;我有一个带有数据表的视图,在更改过滤器选项(复选框)时,我调用一个过滤器操作,做一些工作,然后redirecttoAction到接受我的过滤器信息的主操作。在调试过程中,我可以看到通过操作传递的预期数据,甚至是在构建html的View上传递的数据,但是预期的行数或多或少的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>控制器中的过滤操作- 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);
}我的视图,在字段集中输出过滤的列表表格,其数据行是由foreach构建的(MyFilteredData中的项)
* my View中的html包含在asp:Content块中,没有开始和结束html标记
第一次正确加载页面时,默认的筛选器显示了表中正确的行数;更改复选框以添加到筛选列表中并不会按预期更新html;但是,当我调试和单步执行代码时,正确的数据会通过操作传递回视图;似乎只是没有呈现新的/更新的html。
有人知道为什么不刷新或呈现更新的过滤数据,即使我可以逐步查看我希望看到的吗?
发布于 2010-10-23 01:46:35
我不是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" } );发布于 2010-10-23 04:51:50
你的代码有两个问题。正如@Francis Noriega指出的那样,jquery中需要有一个回调函数来将返回的视图填充回页面中。
然而,更大的问题是:
return RedirectToAction("Review", "myContr", new{id=id,filterList=strList});这将返回一个HTTP302(重定向)到您的jquery调用代码,而不是被调用操作的html内容。您将需要更改操作方法以返回部分视图。
https://stackoverflow.com/questions/3999038
复制相似问题