我正在使用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,但我不希望在没有预览和提示的情况下进行实际的图像交换。我应该重新编写我的索引视图,以便它使用部分视图来完成此操作吗?通过多个步骤和视图保持数据的最简单方法是什么?
答案 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);
}