我正在使用“Composite C1”cms,mvc和razor视图引擎。 某些页面应显示列表项,用户可以按某些条件过滤数据。 第一部分工作正常(项目显示没有问题),我有第二部分的问题 - 过滤数据没有更新,页面显示旧数据。
我有ItemsController:
public class ItemsController : Controller
{
[OutputCache(CacheProfile = "ZeroCacheProfile")]
public ActionResult Filter()
{
// Initialize all filter comboboxes for Items page
// ...
return View(new MyModel());
}
[OutputCache(CacheProfile = "ZeroCacheProfile")]
public ActionResult List()
{
// Set first default items
ViewBag.Items = (IEnumerable)GetRandomItems(8);
return View(new MyModel());
}
[HttpPost]
[ValidateInput(true)]
[OutputCache(CacheProfile = "ZeroCacheProfile")]
public ActionResult List(MyModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Set filtered items
// ...
ViewBag.Items = (IEnumerable)itemList;
return Json(new { Success = true, Filter = filter, ItemNumber = itemList.Count }, JsonRequestBehavior.AllowGet);
}
}
我有两个观点:“List.cshtml” - 为了显示数据和“Filter.cshtml” - 以生成过滤数据的标准。
“过滤器”视图具有对/ Items / List进行查询的脚本, - 以便过滤和更新数据。
<script type="text/javascript" language="javascript">
/* <![CDATA[ */
$(document).ready(function () {
$("#search_button_filter").bind('click', function() {
var $form = $("#filter_form");
$.ajax({
url: '/Items/List/default.aspx',
type: 'POST',
data: $form.serialize(),
success: function (data) {
if (data.Success) {
// Show report: amount of filtered items, etc.
// ...
}
}
});
return false;
});
});
/* ]]> */
</script>
我检查了 - “ActionResult List(MyModel model)”在下一个代码行中设置了正确的过滤数据
ViewBag.Items = (IEnumerable)itemList;
但“列表”视图会继续显示以前的数据。
可能有人告诉我解决问题的方法。
谢谢。
新更新
我重新制作了我的解决方案,它现在有效。我的页面上有两个“列表”和“过滤器”视图,但没有任何Rest / Post,只有Get和QueryString:
<script type="text/javascript" language="javascript">
/* <![CDATA[ */
$(document).ready(function () {
$("#search_button_filter").bind("click", function() {
var $filter1 = $("#filter1_search_filter").val();
var $filter2 = $("#filter2_search_filter").val();
var $filter3 = $("#filter3_search_filter").val();
window.location.href = "@UrlUtil.ItemsPageUrl" + "?&filter1=" + $filter1 + "&filter2=" + $filter2 + "&filter3=" + $filter3;
});
});
/* ]]> */
</script>
但我现在的问题非常小。项目数量在'ActionResult List()'方法(初始化'List'视图)中计算,但我需要在'Filter'视图中显示此值。 我尝试使用TempData集合 - 设置
[OutputCache(CacheProfile = "ZeroCacheProfile")]
public ActionResult List()
{
TempData["AmountOfFilteredItems"] = null;
Guid filter1;
if (!Guid.TryParse(Request.QueryString["filter1"], out filter1))
{
filter1 = Guid.Empty;
}
Guid filter2;
if (!Guid.TryParse(Request.QueryString["filter2"], out filter2))
{
filter2 = Guid.Empty;
}
Guid filter3;
if (!Guid.TryParse(Request.QueryString["filter3"], out filter3))
{
filter3 = Guid.Empty;
}
List<MyModel> items;
if ((filter1 == Guid.Empty) && (filter2 == Guid.Empty) && (filter3 == Guid.Empty))
{
items = GetRandomItems(8);
}
else
{
items = GetFilteredItems(filter1, filter2, filter3);
}
TempData["AmountOfFilteredItems"] = items.Count;
return View(items);
}
值,并在'过滤器'视图中返回此值:
@model MyModel
@using (Html.BeginForm("Items", "Filter", FormMethod.Post, new { @id = "filter_form" }))
{
<!-- Fill required data -->
<!-- ... -->
<font class="bold">@(TempData["AmountOfFilteredItems"].NotNull() ? TempData["AmountOfFilteredItems"] : 0)</font>
}
只有一个问题,这个值总是延迟一步/迭代 - 如果实际数量的项目为'2',则视图显示前一个值'8'。下次当实数为“0”时,它会显示之前的实数值“2”。
我如何解决?
答案 0 :(得分:1)
除非您更新,否则浏览器中的HTML不会更新。浏览器中的代码与服务器上发生的代码断开连接。如果您使用Ajax向服务器发送请求,那么您需要处理响应并对其执行某些操作。
如果要使用Ajax,则需要确保List(MyModel)方法返回部分视图,然后用它覆盖DOM的一部分。
然而,最简单的方法可能是删除Ajax并将其作为普通页面回发处理 - 这将更加简单。它有点旧了,但是MVC中有关于表单帖子的一些信息:
答案 1 :(得分:0)
我刚刚读到TempData的目的是为“下一个”请求提供数据,所以我想知道“当前”请求是否只看到来自“上一个”请求的TempData,因此它不合时宜。
尝试更改为ViewBag,看看是否能解决问题。
EG。在我的行动中,我补充道:
ViewBag.ItemCount = 10;
(注意:它是一个动态对象,因此您可以随时创建属性)。
然后要显示它,我将此添加到我的视图中:
Count: @ViewBag.ItemCount
似乎按预期工作。