如何在 ASP.NET MVC 4 中的两个完全不同的视图之间保留数据?

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 4 中的两个完全不同的视图之间保留数据?【英文标题】:How can I persist data between two completely different views in ASP.NET MVC 4? 【发布时间】:2013-02-21 02:53:09 【问题描述】:

我已经尝试了很长一段时间的解决方案,但无济于事。我有的是一个表格。我将 ASP.NET MVC4 与 jQuery Mobile 一起使用。用户首先被引导到以下屏幕:

在这里,他们选择一个胶囊并点击提交。 他们选择的胶囊有一个主键值,我想保留到下一页。

一旦他们点击提交,他们将被带到:

在这里,他们将填写表格并点击“创建”。您在此屏幕截图中看到的填充物列表基于在前一个屏幕上选择的胶囊。因此,根据选择的胶囊,上面的填充物列表可能会有所不同。如何保留在前一个屏幕上选择的 Capsule 的主键值并将其保留到下一个屏幕(完全不同的视图)?我知道我不能使用 ViewBag,因为 ViewBag 仅在单个视图的范围内。本质上,我想要的是上面表格中的数据,以及上一个视图中选择的胶囊的主键。

【问题讨论】:

需要通过共享密钥或其他方式建立关系。如果我是你,我会使用 Enumeration 代替 Capsule 来保存触发值。 迈克,您似乎还处于网络表单的思维框架中(查看 -> 查看)==(aspx 页面 --> aspx 页面)。拥抱思考控制器 -> 控制器。您当前的问题就是一个很好的例子。您发布的任何数据都将发送到您的操作方法(控制器),并且可以轻松地在模型中传递给您的下一个视图。魔术是控制器。模特就是媒体。视图就是容器。 【参考方案1】:

您需要将值从 View1 发送回服务器,然后通过 Controller 操作方法将其传递回 View2: 下面是一个代码 sn-p 显示发生在服务器上:

//Serve the view when the URL is requested
    public ActionResult ViewAllItems()
     
        return View();
    


//Handle the posted form from the ViewAllItems page
 [HttpPost]
    public ActionResult ViewAllItems(int selectedItemId)
     
        RedirectToAction("ViewItemDetail", new  id = selectedItemId );
    

    public ViewResult ViewItemDetail(int id)
     
       var item = repo.GetItem(id);
       return View(item);
    

这里,带有控制器 Action 方法 ViewAllItems 的方法接收发布的值并重定向到 ViewItemDetail 方法,该方法然后加载项目数据并将其传递给视图。因此视图将被传递 id(连同完整的项目)。

这是一般的 MVC 模式,其中值被传递给控制器​​操作方法,然后再传递回视图。

【讨论】:

问题是当 ViewAllItems 被点击时,我不能立即 RedirectToAction("ViewItemDetail") - 这是因为我在等待用户将数据输入到表单中,然后点击创建,然后他们将被定向到 ViewItemDetail。我正在使用您的示例,因此最容易理解。 ViewAllItems 是接收发送到服务器的表单的 HttpPost 方法。在经典的 MVC 设置中,还会有一个没有 HttpPost 的 ViewAllItems ,它将为首先请求 url 的视图提供服务。我更新了答案以使这一点更清楚。 不用担心,您可能需要一些时间来完成 MVC 教程。 MVC 模式需要一些时间来适应,主要是您将值向上传递并返回到服务器。还要查看模型绑定到视图模型,这在教程中并不总是显示。【参考方案2】:

考虑一下这个伪代码,但本质上控制器可能看起来像这样......

[HttpPost]
public ActionResult FormOnePost(ModelFromFormOne modelFromFormOne)

    var model = new ModelForFormTwo();
    model.Filters = IList<Filter> from database? query using id
    model.MoreStuff etc.
    return View("ViewTwoWithSecondForm", model);

这样可以避免在路径中暴露您的主键。

【讨论】:

@Judo 的回答比较正统。【参考方案3】:

你可以使变量保持值静态

【讨论】:

以上是关于如何在 ASP.NET MVC 4 中的两个完全不同的视图之间保留数据?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4 异步加载控制器

如何在 ASP.NET MVC 4 Beta 中禁用 Javascript/CSS 缩小

asp.net mvc中的Html.TextAreaFor

ASP.NET MVC 中的 RSS 源

如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求

将用户相关数据传递给 ASP.NET MVC 4 中的视图