2015-04-22 61 views
0

我正在使用C#和MVC处理Web应用程序项目,它将采用表单中的两个URL并使用它们来创建我创建的名为“ImageSwap”的类的实例。这个模型有一些数据(执行交换的人的用户名;两个变量保存要交换的两个图像的URL;两个变量保存这些文件的实际名称,而没有剩余的URL信息;以及两个表示检查这些文件的文件位置的数组)。现在,我有这样初始索引视图创建类的实例并将其传递给中放置了通过表格的信息,通过POST提交的,像这样相同的看法:在MVC中的视图之间传递数据

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,这样我就可以拥有一个验证视图,这将允许用户预览两个并排文件,以便他们可以确保他们交换适当的图像。然后,他们应该能够击中另一个提交按钮,这将启动实际移动/替换图像并被带到页面确认。

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

+0

你可以使用会话,数据库,查询字符串参数在任何图层之间传递数据。 – semirturgay

+0

经过简短的研究,看起来好像会话是最合理的方式。由于存储在类中的许多信息很容易从其他变量中派生出来,所以我不打算在数据库中将所有信息都放入数据库中。查询字符串参数需要在URL中传递太多数据。这些假设是否正确?如你所说, – ianodork

+0

会议将是最适合你的情况... – semirturgay

回答

3

什么是必须通过多个步骤 和视图中的数据持久化最简单的方法你一个索引操作返回不同的看法?

你的问题听起来像是你想要实现你可以轻松完成的任务。会话对象允许您在请求之间保持数据,只需将它添加到HttpContext上的Session对象上,该对象位于您的控制器扩展的基类内,如下所示:

(请注意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"]; 

服用它更进一步:

虽然上述将wor k很好,通常在代码中直接引用HttpContext对象并不是一种好的做法,因为它会产生不必要的耦合到易于避免的对象HttpContext。相反,您应该选择通过依赖注入来注入会话对象的实例。 Here is a similar answer提供了关于如何做到这一点的基本思路。

1

您可以使用模型传递给他们如同

if(some condition) 
{ 
    Return View("ViewVersion1", MyModelVersion1); 
} 
else 
{ 
    Return View("ViewVersion2", MyModelVersion2); 
} 
相关问题