【问题标题】:Preserve data in .net mvc在 .net mvc 中保留数据
【发布时间】:2010-11-28 08:11:48
【问题描述】:

我正在实现一个带有结果页面支持分页的搜索模块。 NerdDinner 提供的示例将 pagenumber 作为参数传递给 Index 操作,并且每次用户点击不同的页码时,该操作都会使用 pagenumber 执行查询。

我的问题是我的搜索需要更多的标准,例如价格、材料、型号等,而不仅仅是简单的页码。因此,我想在用户第一次提交后保留标准,这样我只需要来回传递页码。

使用 ViewData 是不可能的,因为一旦 ViewData 被发送到 View 就会被清除。

有什么好的方法可以按我的意愿保存标准数据吗?

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

    您几乎有两种方法可以做到这一点。

    1. 将要保留的数据放入可序列化的会话、缓存或数据库中。将其放入数据库将是最安全的选择,但会降低您的性能。

    2. 您可以将保留的数据存储在隐藏的 html 标记中。只要信息不敏感,此选项应该可以正常工作。

    这里是一些支持代码。您只能在同一个控制器中使用它

    public class questionController : Controller
    {
        public QuestionFormData qdata;
    
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            qdata = (SerializationUtil.Deserialize(Request.Form["qdata"])
                ?? TempData["qdata"]
                ?? new QuestionFormData()) as QuestionFormData;
            TryUpdateModel(qdata);
        }
    
        protected override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            if (filterContext.Result is RedirectToRouteResult)
            {
                TempData["qdata"] = qdata;
            }
        }
    

    像这样访问更新的信息

        public ActionResult Index()
        {
             DateTime d = qdata.date;
        }
    

    在aspx页面中

    <%= Html.Hidden("qdata", SerializationUtil.Serialize(Model)) %>
    

    【讨论】:

    • @luke:我在自己的工作中更喜欢#2。 @Wei Ma:很多人会争辩说,最好反复来回传递信息(不要太大),而不是使用 Session,它本身就有挑战。
    • 感谢卢克和大卫。我不喜欢在控制器和视图之间来回传递数据。但大卫叫醒了我。毕竟,数据的大小不会超过几百字节。也许甚至不如 http 开销。
    • 什么是 SerializationUtil 命名空间?
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多