在MVC中的视图之间传递数据

时间:2015-04-22 18:16:41

标签: c# asp.net-mvc asp.net-mvc-4

我正在使用C#和MVC开发Web应用程序项目,该项目将在表单中接收两个URL并使用它们来创建我创建的名为“ImageSwap”的类的实例。此模型有一些数据(执行交换的人的用户名;两个变量,用于保存要交换的两个图像的URL;两个变量,用于保存这些文件的实际名称,而不包含所有其余的URL信息;以及两个表示检查这些文件的文件位置的数组。现在,我有了它,以便初始索引视图创建类的实例并将其传递到同一视图,其中包含通过表单输入的信息,通过POST提交,如下所示:

public ActionResult Index()
{
Ops.Operations.Models.ImageSwapModel newImageSwap = new Models.ImageSwapModel();
return View(newImageSwap);
}

[HttpPost]
    public ActionResult Index(ImageSwapModel imageSwap)
    {
        var oldFileFound = false;
        var newFileFound = false;

        if (ModelState.IsValid)
        {
        //Perform data manipulation and set needed values
        }
     }

然后它对数据执行一些功能,例如解析URL末尾的文件名和目录号(这是该文件名的第一部分,即目录#_fileName.jpg)。所有这一切都很好。

我的问题是,我希望将此模型传递到另一个视图,一旦它的所有字段中的数据都由此初始ActionResult填充,以便我可以拥有验证视图,这将允许用户预览这两个文件并排,以便他们可以确保他们交换适当的图像。然后,他们应该能够点击另一个提交按钮,该按钮将启动图像的实际移动/替换并被带到页面确认。

有没有办法将数据从此控制器传递到其他视图?我的困惑之所以产生,是因为我无法使用相同的输入创建另一个版本的IndexR的ActionResult,但我不希望在没有预览和提示的情况下进行实际的图像交换。我应该重新编写我的索引视图,以便它使用部分视图来完成此操作吗?通过多个步骤和视图保持数据的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

  

通过多个步骤保持数据的最简单方法是什么   和观点?

您的问题听起来像是在尝试实现您可以通过会话轻松完成的任务。会话对象允许您在请求之间保留数据,只需将其添加到控制器扩展的基类中存在的Session上的HttpContext对象,如下所示:

(注意Serializable属性。这允许将对象序列化到会话对象中。)

[Serializable]
public class ImageSwapModel {
    // Your class's properties
}

然后在您的控制器中,您可以执行以下操作:

[HttpPost]
public ActionResult Index(ImageSwapModel imageSwap)
{
    var oldFileFound = false;
    var newFileFound = false;

    if (ModelState.IsValid)
    {
        this.HttpContext.Session["ImageSwap"] = imageSwap;
    }
 }

当您想要检索模型时,您可以从会话中获取它,如下所示:

var imageSwap = (ImageSwapModel)this.HttpContext.Session["ImageSwap"];

更进一步:

虽然上述方法可以正常工作,但通常在代码中直接引用HttpContext对象并不是一个好习惯,因为它会创建与HttpContext对象的不必要的耦合,这很容易避免。相反,您应该选择通过依赖注入注入会话对象的实例。 Here is a similar answer提供了关于如何做到这一点的基本想法。

答案 1 :(得分:1)

您可以在一个Index操作(例如

)中传递给模型的模型返回不同的视图
if(some condition)
{
   Return View("ViewVersion1", MyModelVersion1);
}
else
{
   Return View("ViewVersion2", MyModelVersion2);
}