使用MVC会话在访问之间存储客户端值(例如过滤器文本)

时间:2018-01-31 15:49:33

标签: javascript asp.net-mvc session

在MVC视图中,是否有一种有效的方法来存储客户端值以供后续页面访问使用?

典型情况

索引页面有一个表格有点长,所以我添加了一个过滤器(我知道分页是另一种选择)并使用带有一些JavaScript的输入控件来限制表格行而不必执行另一个& #34;获取"来自服务器。

这很好但是,如果我导航(比方说)到编辑页面然后返回索引页面,过滤器显然不再存在。

经过一番搜索,我从未发现任何简单的内容,所以我在下面发布了微薄的答案。

1 个答案:

答案 0 :(得分:0)

视图在页面顶部包含一个表单,用户可以在其中键入过滤器文本(在表单“获取”上,文本是从会话值设置的): -

<form id="frmEdit">
    @Html.AntiForgeryToken()

    <div class="form-group row">
        <div class="col-sm-6">
                @Html.ActionLink("Create New", "Create", null, new { @class = "nav-item nav-link" })
        </div>
        <label for="search" class="col-sm-2 col-form-label text-right">Filter</label>
        <div class="col-sm-4">
            <input type="text" placeholder="Filter" class="form-control" id="search" value=@Session["SparesSectionFilter"]>
        </div>
    </div>
</form>

脚本部分包含过滤JavaScript,但也包含对控制器的回发

@section Scripts{
    <script type="text/javascript">
        // on load
        PerformFilter();

        // hook up events
        $(function () {
            $("input#search").on("keydown keyup", function () {
                PerformFilter();

                // post back to session for reuse
                $.post('SparesSections/Session_Add', { __RequestVerificationToken: $('[name=__RequestVerificationToken]').val(), itemName: 'SparesSectionFilter', itemValue: $("#search").val() });
            });
        })
   </script>
}

我为我的控制器设置了一个自定义基类,我已添加了以下操作。这些可以在任何使用此类的控制器中使用。 Razor视图加载了会话值,但我在控制器中包含了一个“Get”,用于客户端选项。

 [HttpPost]
 [ValidateAntiForgeryToken]
    public ActionResult Session_Add(string itemName, string itemValue)
    {
        Session.Add(itemName, itemValue);

        return Json(new { itemName = itemName, itemValue = itemValue }, JsonRequestBehavior.AllowGet);
    }

    [HttpGet]
    public ActionResult Session_Get(string itemName)
    {
        return Json(new { itemName = itemName, itemValue = Session[itemName] ?? string.Empty }, JsonRequestBehavior.AllowGet);
    }