发布后未更新数据(mvc razor)

时间:2011-04-30 23:08:38

标签: asp.net asp.net-mvc razor

我正在使用“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);
}
控制器的'ActionResult List()'方法中的

值,并在'过滤器'视图中返回此值:

@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”。

我如何解决?

2 个答案:

答案 0 :(得分:1)

除非您更新,否则浏览器中的HTML不会更新。浏览器中的代码与服务器上发生的代码断开连接。如果您使用Ajax向服务器发送请求,那么您需要处理响应并对其执行某些操作。

如果要使用Ajax,则需要确保List(MyModel)方法返回部分视图,然后用它覆盖DOM的一部分。

然而,最简单的方法可能是删除Ajax并将其作为普通页面回发处理 - 这将更加简单。它有点旧了,但是MVC中有关于表单帖子的一些信息:

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

答案 1 :(得分:0)

我刚刚读到TempData的目的是为“下一个”请求提供数据,所以我想知道“当前”请求是否只看到来自“上一个”请求的TempData,因此它不合时宜。

尝试更改为ViewBag,看看是否能解决问题。

EG。在我的行动中,我补充道:

ViewBag.ItemCount = 10;

(注意:它是一个动态对象,因此您可以随时创建属性)。

然后要显示它,我将此添加到我的视图中:

Count: @ViewBag.ItemCount

似乎按预期工作。